[MITgcm-devel] problem with TAF latest version (2.0.2)

Jean-Michel Campin jmc at ocean.mit.edu
Thu Oct 14 14:05:57 EDT 2010


Hi, 

we have a problem with the latest version of TAF (2.0.2)
which was turned on early this morning.
The verification experiment tutorial_global_oce_optim did not
run on faulks (compiled with gfortran):
> faulks{run}% mitgcmuv_ad > std_outp
> Killed

and on my laptop, with gfortran, I am getting errors at the link stage:
> In function `adautodiff_restore':
> /home/jmc/mitgcm/gcm_gnu/verification/tutorial_global_oce_optim/bld_ad/ad_taf_output.f:530: relocation truncated to fit: R_X86_64_32S against symbol `addynvars_r_2_' defined in COMMON section in ad_taf_output.o
> /home/jmc/mitgcm/gcm_gnu/verification/tutorial_global_oce_optim/bld_ad/ad_taf_output.f:531: relocation truncated to fit: R_X86_64_32S against symbol `addynvars_r_2_' defined in COMMON section in ad_taf_output.o
> ad_taf_output.o: In function `adautodiff_store':
> /home/jmc/mitgcm/gcm_gnu/verification/tutorial_global_oce_optim/bld_ad/ad_taf_output.f:791: relocation truncated to fit: R_X86_64_32S against symbol `addynvars_r_2_' defined in COMMON section in ad_taf_output.o

the TAF option (from taf_ad.log) that I use are:
> taf -outdir . -v1 -reverse -admark ad -i4 -r4 -l taf_ad.log -flow taf_ad_flow.log -toplevel the_main_loop -input xx_theta_dummy,xx_salt_dummy,xx_hflux_dummy,xx_sflux_dummy,xx_tauu_dummy,xx_tauv_dummy,xx_atemp_dummy,xx_aqh_dummy,xx_uwind_dummy,xx_vwind_dummy,xx_diffkr_dummy,xx_kapgm_dummy,xx_efluxp_dummy,xx_hfluxm_dummy -output fc ad_input_code.f

I went back to version 2.0.0 with exactly the same source code and
things were OK (compile and run).

I attach the source code (ad_input_code.f) and the 2 output from TAF,
generated with version 2.0.0 (ad_input_code_ad.f.old) and
with version 2.0.2 (ad_input_code_ad.f.new).

I don't see any obvious reason why we have this problem,
and going to try other compilers and other test experiments.

Thanks,
Jean-Michel
-------------- next part --------------
cadj SUBROUTINE active_read_rl INPUT   = 1, 2, 3, 4, 5, 6, 7, 8, 9
cadj SUBROUTINE active_read_rl OUTPUT  =    2
cadj SUBROUTINE active_write_rl INPUT   = 1, 2, 3, 4, 5, 6, 7, 8
cadj SUBROUTINE active_write_rl OUTPUT  =    2
cadj SUBROUTINE active_read_tile_rl INPUT   = 1, 2, 3, 4, 5, 6, 7, 8, 9
cadj SUBROUTINE active_read_tile_rl INPUT  += 10, 11
cadj SUBROUTINE active_read_tile_rl OUTPUT  =    2
cadj SUBROUTINE active_write_tile_rl INPUT   = 1, 2, 3, 4, 5, 6, 7, 8, 9
cadj SUBROUTINE active_write_tile_rl INPUT  += 10
cadj SUBROUTINE active_write_tile_rl OUTPUT  =    2
cadj SUBROUTINE active_read_xz_rl INPUT   = 1, 2, 3, 4, 5, 6, 7, 8, 9
cadj SUBROUTINE active_read_xz_rl OUTPUT  =    2
cadj SUBROUTINE active_write_xz_rl INPUT   = 1, 2, 3, 4, 5, 6, 7, 8
cadj SUBROUTINE active_write_xz_rl OUTPUT  =    2
cadj SUBROUTINE active_read_yz_rl INPUT   = 1, 2, 3, 4, 5, 6, 7, 8, 9
cadj SUBROUTINE active_read_yz_rl OUTPUT  =    2
cadj SUBROUTINE active_write_yz_rl INPUT   = 1, 2, 3, 4, 5, 6, 7, 8
cadj SUBROUTINE active_write_yz_rl OUTPUT  =    2
cadj SUBROUTINE active_read_xy FTLNAME = g_active_read_xy
cadj SUBROUTINE active_read_xy ADNAME  = adactive_read_xy
cadj SUBROUTINE active_read_xy INPUT   = 1   , 3, 4, 5, 6, 7, 8
cadj SUBROUTINE active_read_xy OUTPUT  =    2
cadj SUBROUTINE active_read_xy ACTIVE  =    2
cadj SUBROUTINE active_read_xy DEPEND  = 1,    3, 4, 5, 6, 7
cadj SUBROUTINE active_read_xyz FTLNAME = g_active_read_xyz
cadj SUBROUTINE active_read_xyz ADNAME  = adactive_read_xyz
cadj SUBROUTINE active_read_xyz INPUT   = 1   , 3, 4, 5, 6, 7, 8
cadj SUBROUTINE active_read_xyz OUTPUT  =    2
cadj SUBROUTINE active_read_xyz ACTIVE  =    2
cadj SUBROUTINE active_read_xyz DEPEND  = 1,    3, 4, 5, 6, 7
cadj SUBROUTINE active_read_xz FTLNAME = g_active_read_xz
cadj SUBROUTINE active_read_xz ADNAME  = adactive_read_xz
cadj SUBROUTINE active_read_xz INPUT   = 1   , 3, 4, 5, 6, 7, 8
cadj SUBROUTINE active_read_xz OUTPUT  =    2
cadj SUBROUTINE active_read_xz ACTIVE  =    2
cadj SUBROUTINE active_read_xz DEPEND  = 1,    3, 4, 5, 6, 7
cadj SUBROUTINE active_read_yz FTLNAME = g_active_read_yz
cadj SUBROUTINE active_read_yz ADNAME  = adactive_read_yz
cadj SUBROUTINE active_read_yz INPUT   = 1   , 3, 4, 5, 6, 7, 8
cadj SUBROUTINE active_read_yz OUTPUT  =    2
cadj SUBROUTINE active_read_yz ACTIVE  =    2
cadj SUBROUTINE active_read_yz DEPEND  = 1,    3, 4, 5, 6, 7
cadj SUBROUTINE active_write_xy FTLNAME = g_active_write_xy
cadj SUBROUTINE active_write_xy ADNAME  = adactive_write_xy
cadj SUBROUTINE active_write_xy INPUT   = 1, 2, 3, 4, 5, 6
cadj SUBROUTINE active_write_xy OUTPUT  =                6
cadj SUBROUTINE active_write_xy ACTIVE  =    2         , 6
cadj SUBROUTINE active_write_xy DEPEND  = 1,    3, 4, 5
cadj SUBROUTINE active_write_xyz FTLNAME = g_active_write_xyz
cadj SUBROUTINE active_write_xyz ADNAME  = adactive_write_xyz
cadj SUBROUTINE active_write_xyz INPUT   = 1, 2, 3, 4, 5, 6
cadj SUBROUTINE active_write_xyz OUTPUT  =                6
cadj SUBROUTINE active_write_xyz ACTIVE  =    2         , 6
cadj SUBROUTINE active_write_xyz DEPEND  = 1,    3, 4, 5
cadj SUBROUTINE active_write_xz FTLNAME = g_active_write_xz
cadj SUBROUTINE active_write_xz ADNAME  = adactive_write_xz
cadj SUBROUTINE active_write_xz INPUT   = 1   , 3, 4, 5, 6, 7, 8
cadj SUBROUTINE active_write_xz OUTPUT  =    2
cadj SUBROUTINE active_write_xz ACTIVE  =    2
cadj SUBROUTINE active_write_xz DEPEND  = 1,    3, 4, 5, 6, 7
cadj SUBROUTINE active_write_yz FTLNAME = g_active_write_yz
cadj SUBROUTINE active_write_yz ADNAME  = adactive_write_yz
cadj SUBROUTINE active_write_yz INPUT   = 1   , 3, 4, 5, 6, 7, 8
cadj SUBROUTINE active_write_yz OUTPUT  =    2
cadj SUBROUTINE active_write_yz ACTIVE  =    2
cadj SUBROUTINE active_write_yz DEPEND  = 1,    3, 4, 5, 6, 7
cadj SUBROUTINE active_read_tile_xy FTLNAME = g_active_read_tile_xy
cadj SUBROUTINE active_read_tile_xy ADNAME  = adactive_read_tile_xy
cadj SUBROUTINE active_read_tile_xy INPUT   = 1   , 3, 4, 5, 6, 7, 8, 9
cadj SUBROUTINE active_read_tile_xy OUTPUT  =    2
cadj SUBROUTINE active_read_tile_xy ACTIVE  =    2
cadj SUBROUTINE active_read_tile_xy DEPEND  = 1,    3, 4, 5, 6, 7, 8, 9
cadj SUBROUTINE active_read_tile_xyz FTLNAME = g_active_read_tile_xyz
cadj SUBROUTINE active_read_tile_xyz ADNAME  = adactive_read_tile_xyz
cadj SUBROUTINE active_read_tile_xyz INPUT   = 1   , 3, 4, 5, 6, 7, 8, 9
cadj SUBROUTINE active_read_tile_xyz OUTPUT  =    2
cadj SUBROUTINE active_read_tile_xyz ACTIVE  =    2
cadj SUBROUTINE active_read_tile_xyz DEPEND  = 1,    3, 4, 5, 6, 7, 8, 9
cadj SUBROUTINE active_write_tile_xy FTLNAME = g_active_write_tile_xy
cadj SUBROUTINE active_write_tile_xy ADNAME  = adactive_write_tile_xy
cadj SUBROUTINE active_write_tile_xy INPUT   = 1, 2, 3, 4, 5, 6, 7
cadj SUBROUTINE active_write_tile_xy OUTPUT  =
cadj SUBROUTINE active_write_tile_xy ACTIVE  =    2
cadj SUBROUTINE active_write_tile_xy DEPEND  = 1,    3, 4, 5, 6, 7
cadj SUBROUTINE active_write_tile_xyz FTLNAME = g_active_write_tile_xyz
cadj SUBROUTINE active_write_tile_xyz ADNAME  = adactive_write_tile_xyz
cadj SUBROUTINE active_write_tile_xyz INPUT   = 1, 2, 3, 4, 5, 6, 7
cadj SUBROUTINE active_write_tile_xyz OUTPUT  =
cadj SUBROUTINE active_write_tile_xyz ACTIVE  =    2
cadj SUBROUTINE active_write_tile_xyz DEPEND  = 1,    3, 4, 5, 6, 7
cadj SUBROUTINE active_read_rl_loc INPUT   = 1, 2, 3, 4, 5, 6, 7, 8, 9
cadj SUBROUTINE active_read_rl_loc OUTPUT  =    2
cadj SUBROUTINE active_write_rl_loc INPUT   = 1, 2, 3, 4, 5, 6, 7, 8
cadj SUBROUTINE active_write_rl_loc OUTPUT  =    2
cadj SUBROUTINE active_read_xz_rl_loc INPUT  = 1, 2, 3, 4, 5, 6, 7, 8, 9
cadj SUBROUTINE active_read_xz_rl_loc OUTPUT =    2
cadj SUBROUTINE active_write_xz_rl_loc INPUT  = 1, 2, 3, 4, 5, 6, 7, 8
cadj SUBROUTINE active_write_xz_rl_loc OUTPUT =    2
cadj SUBROUTINE active_read_yz_rl_loc INPUT  = 1, 2, 3, 4, 5, 6, 7, 8, 9
cadj SUBROUTINE active_read_yz_rl_loc OUTPUT =    2
cadj SUBROUTINE active_write_yz_rl_loc INPUT  = 1, 2, 3, 4, 5, 6, 7, 8
cadj SUBROUTINE active_write_yz_rl_loc OUTPUT =    2
cadj SUBROUTINE active_read_xy_loc FTLNAME = g_active_read_xy_loc
cadj SUBROUTINE active_read_xy_loc ADNAME  = adactive_read_xy_loc
cadj SUBROUTINE active_read_xy_loc INPUT   = 1   , 3, 4, 5, 6, 7, 8
cadj SUBROUTINE active_read_xy_loc OUTPUT  =    2
cadj SUBROUTINE active_read_xy_loc ACTIVE  =    2
cadj SUBROUTINE active_read_xy_loc DEPEND  = 1,    3, 4, 5, 6, 7
cadj SUBROUTINE active_read_xyz_loc FTLNAME = g_active_read_xyz_loc
cadj SUBROUTINE active_read_xyz_loc ADNAME  = adactive_read_xyz_loc
cadj SUBROUTINE active_read_xyz_loc INPUT   = 1   , 3, 4, 5, 6, 7, 8
cadj SUBROUTINE active_read_xyz_loc OUTPUT  =    2
cadj SUBROUTINE active_read_xyz_loc ACTIVE  =    2
cadj SUBROUTINE active_read_xyz_loc DEPEND  = 1,    3, 4, 5, 6, 7
cadj SUBROUTINE active_read_xz_loc FTLNAME = g_active_read_xz_loc
cadj SUBROUTINE active_read_xz_loc ADNAME  = adactive_read_xz_loc
cadj SUBROUTINE active_read_xz_loc INPUT   = 1   , 3, 4, 5, 6, 7, 8
cadj SUBROUTINE active_read_xz_loc OUTPUT  =    2
cadj SUBROUTINE active_read_xz_loc ACTIVE  =    2
cadj SUBROUTINE active_read_xz_loc DEPEND  = 1,    3, 4, 5, 6, 7
cadj SUBROUTINE active_read_yz_loc FTLNAME = g_active_read_yz_loc
cadj SUBROUTINE active_read_yz_loc ADNAME  = adactive_read_yz_loc
cadj SUBROUTINE active_read_yz_loc INPUT   = 1   , 3, 4, 5, 6, 7, 8
cadj SUBROUTINE active_read_yz_loc OUTPUT  =    2
cadj SUBROUTINE active_read_yz_loc ACTIVE  =    2
cadj SUBROUTINE active_read_yz_loc DEPEND  = 1,    3, 4, 5, 6, 7
cadj SUBROUTINE active_write_xy_loc FTLNAME = g_active_write_xy_loc
cadj SUBROUTINE active_write_xy_loc ADNAME  = adactive_write_xy_loc
cadj SUBROUTINE active_write_xy_loc INPUT   = 1, 2, 3, 4, 5, 6
cadj SUBROUTINE active_write_xy_loc OUTPUT  =                6
cadj SUBROUTINE active_write_xy_loc ACTIVE  =    2         , 6
cadj SUBROUTINE active_write_xy_loc DEPEND  = 1,    3, 4, 5
cadj SUBROUTINE active_write_xyz_loc FTLNAME = g_active_write_xyz_loc
cadj SUBROUTINE active_write_xyz_loc ADNAME  = adactive_write_xyz_loc
cadj SUBROUTINE active_write_xyz_loc INPUT   = 1, 2, 3, 4, 5, 6
cadj SUBROUTINE active_write_xyz_loc OUTPUT  =                6
cadj SUBROUTINE active_write_xyz_loc ACTIVE  =    2         , 6
cadj SUBROUTINE active_write_xyz_loc DEPEND  = 1,    3, 4, 5
cadj SUBROUTINE active_write_xz_loc FTLNAME = g_active_write_xz_loc
cadj SUBROUTINE active_write_xz_loc ADNAME  = adactive_write_xz_loc
cadj SUBROUTINE active_write_xz_loc INPUT   = 1   , 3, 4, 5, 6, 7, 8
cadj SUBROUTINE active_write_xz_loc OUTPUT  =    2
cadj SUBROUTINE active_write_xz_loc ACTIVE  =    2
cadj SUBROUTINE active_write_xz_loc DEPEND  = 1,    3, 4, 5, 6, 7
cadj SUBROUTINE active_write_yz_loc FTLNAME = g_active_write_yz_loc
cadj SUBROUTINE active_write_yz_loc ADNAME  = adactive_write_yz_loc
cadj SUBROUTINE active_write_yz_loc INPUT   = 1   , 3, 4, 5, 6, 7, 8
cadj SUBROUTINE active_write_yz_loc OUTPUT  =    2
cadj SUBROUTINE active_write_yz_loc ACTIVE  =    2
cadj SUBROUTINE active_write_yz_loc DEPEND  = 1,    3, 4, 5, 6, 7
cadj SUBROUTINE autodiff_inadmode_set INPUT   = 1
cadj SUBROUTINE autodiff_inadmode_set OUTPUT  =
cadj SUBROUTINE autodiff_inadmode_set ACTIVE  =
cadj SUBROUTINE autodiff_inadmode_set DEPEND  = 1
cadj SUBROUTINE autodiff_inadmode_set REQUIRED
cadj SUBROUTINE autodiff_inadmode_set INFLUENCED
cadj SUBROUTINE autodiff_inadmode_set ADNAME  =
CADJ & adautodiff_inadmode_set
cadj SUBROUTINE autodiff_inadmode_set FTLNAME  =
CADJ & g_autodiff_inadmode_set
cadj SUBROUTINE autodiff_inadmode_unset INPUT   = 1
cadj SUBROUTINE autodiff_inadmode_unset OUTPUT  =
cadj SUBROUTINE autodiff_inadmode_unset ACTIVE  =
cadj SUBROUTINE autodiff_inadmode_unset DEPEND  = 1
cadj SUBROUTINE autodiff_inadmode_unset REQUIRED
cadj SUBROUTINE autodiff_inadmode_unset INFLUENCED
cadj SUBROUTINE autodiff_inadmode_unset ADNAME  =
CADJ & adautodiff_inadmode_unset
cadj SUBROUTINE autodiff_inadmode_unset FTLNAME  =
CADJ & g_autodiff_inadmode_unset
CADJ SUBROUTINE cg2d ADNAME  = cg2d
CADJ SUBROUTINE cg2d FTLNAME = cg2d
CADJ SUBROUTINE cg2d INPUT   = 1,2,3,4,5,6
CADJ SUBROUTINE cg2d OUTPUT  =   2,3,4,5
CADJ SUBROUTINE cg2d ACTIVE  = 1,2
CADJ SUBROUTINE cg2d DEPEND  =           6
CADJ SUBROUTINE do_write_pickup  INPUT  = 1,2,3,4
CADJ SUBROUTINE do_write_pickup  OUTPUT =
CADJ SUBROUTINE do_write_pickup  DEPEND = 1,2,3,4
CADJ SUBROUTINE do_write_pickup  REQUIRED
CADJ SUBROUTINE write_pickup  INPUT  = 1,2,3,4
CADJ SUBROUTINE write_pickup  OUTPUT =
CADJ SUBROUTINE write_pickup  DEPEND = 1,2,3,4
CADJ SUBROUTINE write_pickup  REQUIRED
CADJ SUBROUTINE packages_write_pickup  INPUT  = 1,2,3,4
CADJ SUBROUTINE packages_write_pickup  OUTPUT =
CADJ SUBROUTINE packages_write_pickup  DEPEND = 1,2,3,4
CADJ SUBROUTINE packages_write_pickup  REQUIRED
CADJ SUBROUTINE write_checkpoint  INPUT  = 1,2,3,4
CADJ SUBROUTINE write_checkpoint  OUTPUT =
CADJ SUBROUTINE write_checkpoint  DEPEND = 1,2,3,4
CADJ SUBROUTINE write_checkpoint  REQUIRED
CADJ SUBROUTINE check_pickup  INPUT  = 1,2,3,4,5
CADJ SUBROUTINE check_pickup  OUTPUT =
cadj SUBROUTINE damp_adj FTLNAME = g_damp_adj
cadj SUBROUTINE damp_adj ADNAME  = addamp_adj
cadj SUBROUTINE damp_adj INPUT   = 1, 2, 3, 4, 5, 6, 7
cadj SUBROUTINE damp_adj OUTPUT  =
cadj SUBROUTINE damp_adj ACTIVE  =                6
cadj SUBROUTINE damp_adj DEPEND  = 1, 2, 3, 4, 5   , 7
CADJ SUBROUTINE DO_TIME_AVERAGES  INPUT  = 1,2,3,4,5
CADJ SUBROUTINE DO_TIME_AVERAGES  OUTPUT =
CADJ SUBROUTINE TIMEAVER_1FLD_XYZ  INPUT  = 1,  3,4,5,6,7
CADJ SUBROUTINE TIMEAVER_1FLD_XYZ  OUTPUT =   2
CADJ SUBROUTINE TIMEAVER_2FLD_XYZ  INPUT  = 1,2,  4,5,6,7,8,9
CADJ SUBROUTINE TIMEAVER_2FLD_XYZ  OUTPUT =     3
CADJ SUBROUTINE TIMEAVER_FINAL_XY  INPUT  =   2,3,4,5
CADJ SUBROUTINE TIMEAVER_FINAL_XY  OUTPUT = 1
CADJ SUBROUTINE TIMEAVER_FINAL_XYZ  INPUT  =   2,3,4,5,6
CADJ SUBROUTINE TIMEAVER_FINAL_XYZ  OUTPUT = 1
CADJ SUBROUTINE TIMEAVER_INI_XY  INPUT  =   2,3,4
CADJ SUBROUTINE TIMEAVER_INI_XY  OUTPUT = 1
CADJ SUBROUTINE TIMEAVER_INI_XYZ  INPUT  =   2,3,4,5
CADJ SUBROUTINE TIMEAVER_INI_XYZ  OUTPUT = 1
CADJ SUBROUTINE WRITE_TIME_AVERAGES  INPUT  = 1,2,3
CADJ SUBROUTINE WRITE_TIME_AVERAGES  OUTPUT =
CADJ SUBROUTINE DO_STATEVARS_DIAGS  INPUT  = 1,2,3,4
CADJ SUBROUTINE DO_STATEVARS_DIAGS  OUTPUT =
CADJ SUBROUTINE DO_STATEVARS_DIAGS  DEPEND = 1,2,3,4
CADJ SUBROUTINE DO_STATEVARS_DIAGS  REQUIRED
CADJ SUBROUTINE DO_STATEVARS_TAVE  INPUT  = 1,2,3
CADJ SUBROUTINE DO_STATEVARS_TAVE  OUTPUT =
CADJ SUBROUTINE DO_STATEVARS_TAVE  DEPEND = 1,2,3
CADJ SUBROUTINE DO_STATEVARS_TAVE  REQUIRED
cadj SUBROUTINE dummy_in_stepping INPUT   = 1, 2, 3
cadj SUBROUTINE dummy_in_stepping OUTPUT  =
cadj SUBROUTINE dummy_in_stepping ACTIVE  =
cadj SUBROUTINE dummy_in_stepping DEPEND  = 1, 2, 3
cadj SUBROUTINE dummy_in_stepping REQUIRED
cadj SUBROUTINE dummy_in_stepping INFLUENCED
cadj SUBROUTINE dummy_in_stepping ADNAME  = addummy_in_stepping
cadj SUBROUTINE dummy_in_stepping FTLNAME = g_dummy_in_stepping
cadj SUBROUTINE global_max_r4 INPUT   = 1, 2
cadj SUBROUTINE global_max_r4 OUTPUT  = 1
cadj SUBROUTINE global_max_r4 ACTIVE  = 1
cadj SUBROUTINE global_max_r4 DEPEND  = 2
cadj SUBROUTINE global_max_r4 ADNAME  = global_admax_r4
cadj SUBROUTINE global_max_r4 FTLNAME = global_max_r4
cadj SUBROUTINE global_max_r8 INPUT   = 1, 2
cadj SUBROUTINE global_max_r8 OUTPUT  = 1
cadj SUBROUTINE global_max_r8 ACTIVE  = 1
cadj SUBROUTINE global_max_r8 DEPEND  = 2
cadj SUBROUTINE global_max_r8 ADNAME  = global_admax_r8
cadj SUBROUTINE global_max_r8 FTLNAME = global_max_r8
cadj SUBROUTINE global_sum_r4 INPUT   = 1, 2
cadj SUBROUTINE global_sum_r4 OUTPUT  = 1
cadj SUBROUTINE global_sum_r4 ACTIVE  = 1
cadj SUBROUTINE global_sum_r4 DEPEND  = 2
cadj SUBROUTINE global_sum_r4 ADNAME  = global_adsum_r4
cadj SUBROUTINE global_sum_r4 FTLNAME = global_sum_r4
cadj SUBROUTINE global_sum_r8 INPUT   = 1, 2
cadj SUBROUTINE global_sum_r8 OUTPUT  = 1
cadj SUBROUTINE global_sum_r8 ACTIVE  = 1
cadj SUBROUTINE global_sum_r8 DEPEND  = 2
cadj SUBROUTINE global_sum_r8 ADNAME  = global_adsum_r8
cadj SUBROUTINE global_sum_r8 FTLNAME = global_sum_r8
cadj SUBROUTINE global_sum_tile_rl INPUT   = 1,    3
cadj SUBROUTINE global_sum_tile_rl OUTPUT  =    2
cadj SUBROUTINE global_sum_tile_rl ACTIVE  = 1, 2
cadj SUBROUTINE global_sum_tile_rl DEPEND  =       3
cadj SUBROUTINE global_sum_tile_rl ADNAME  = global_adsum_tile_rl
cadj SUBROUTINE global_sum_tile_rl FTLNAME = global_sum_tile_rl
CADJ SUBROUTINE ini_parms INPUT  = 1
CADJ SUBROUTINE ini_parms OUTPUT =
CADJ SUBROUTINE READSYMTILE_RS INPUT  = 1,2 ,4,5 ,7
CADJ SUBROUTINE READSYMTILE_RS OUTPUT =    3,   6
CADJ SUBROUTINE calc_oce_mxlayer  INPUT  = 1,2,3,4,5,6,7
CADJ SUBROUTINE calc_oce_mxlayer  OUTPUT =
CADJ SUBROUTINE do_the_model_io  INPUT  = 1,2,3,4
CADJ SUBROUTINE do_the_model_io  OUTPUT =
CADJ SUBROUTINE do_the_model_io  DEPEND = 1,2,3,4
CADJ SUBROUTINE do_the_model_io  REQUIRED
CADJ SUBROUTINE TURNOFF_MODEL_IO INPUT  = 1,2
CADJ SUBROUTINE TURNOFF_MODEL_IO OUTPUT =
CADJ SUBROUTINE modeldata_example INPUT  = 1
CADJ SUBROUTINE modeldata_example OUTPUT =
CADJ SUBROUTINE plot_field_xyrs INPUT  = 1,2,3,4
CADJ SUBROUTINE plot_field_xyrs OUTPUT =
CADJ SUBROUTINE plot_field_xyrl INPUT  = 1,2,3,4
CADJ SUBROUTINE plot_field_xyrl OUTPUT =
CADJ SUBROUTINE plot_field_xyzrs INPUT  = 1,2,3,4,5
CADJ SUBROUTINE plot_field_xyzrs OUTPUT =
CADJ SUBROUTINE plot_field_xyzrl INPUT  = 1,2,3,4,5
CADJ SUBROUTINE plot_field_xyzrl OUTPUT =
CADJ SUBROUTINE plot_field_xzrs INPUT  = 1,2,3,4,5
CADJ SUBROUTINE plot_field_xzrs OUTPUT =
CADJ SUBROUTINE plot_field_xzrl INPUT  = 1,2,3,4,5
CADJ SUBROUTINE plot_field_xzrl OUTPUT =
CADJ SUBROUTINE plot_field_yzrs INPUT  = 1,2,3,4,5
CADJ SUBROUTINE plot_field_yzrs OUTPUT =
CADJ SUBROUTINE plot_field_yzrl INPUT  = 1,2,3,4,5
CADJ SUBROUTINE plot_field_yzrl OUTPUT =
CADJ SUBROUTINE write_state  INPUT  = 1,2,3
CADJ SUBROUTINE write_state  OUTPUT =
CADJ function myactivefunction  INPUT  = 1,2
CADJ function myactivefunction  OUTPUT =
CADJ function myactivefunction  ACTIVE = 1
CADJ function myactivefunction  DEPEND = 1,2
CADJ function myactivefunction  INFLUENCED
CADJ function myactivefunction  REQUIRED
CADJ function myactivefunction  ADNAME  = admyactivefunction
CADJ function myactivefunction  FTLNAME = g_myactivefunction
cadj SUBROUTINE zero_adj_1d FTLNAME = g_zero_adj_1d
cadj SUBROUTINE zero_adj_1d ADNAME  = adzero_adj_1d
cadj SUBROUTINE zero_adj_1d INPUT   = 1, 2, 3
cadj SUBROUTINE zero_adj_1d OUTPUT  =
cadj SUBROUTINE zero_adj_1d ACTIVE  =    2
cadj SUBROUTINE zero_adj_1d DEPEND  = 1,    3
cadj SUBROUTINE zero_adj_loc FTLNAME = g_zero_adj_loc
cadj SUBROUTINE zero_adj_loc ADNAME  = adzero_adj_loc
cadj SUBROUTINE zero_adj_loc INPUT   = 1, 2, 3
cadj SUBROUTINE zero_adj_loc OUTPUT  =
cadj SUBROUTINE zero_adj_loc ACTIVE  =    2   
cadj SUBROUTINE zero_adj_loc DEPEND  = 1,    3
cadj SUBROUTINE zero_adj FTLNAME = g_zero_adj
cadj SUBROUTINE zero_adj ADNAME  = adzero_adj
cadj SUBROUTINE zero_adj INPUT   = 1, 2, 3
cadj SUBROUTINE zero_adj OUTPUT  =
cadj SUBROUTINE zero_adj ACTIVE  =    2 
cadj SUBROUTINE zero_adj DEPEND  = 1,    3
CADJ SUBROUTINE cd_code_read_pickup  INPUT  = 1,2
CADJ SUBROUTINE cd_code_read_pickup  OUTPUT =
CADJ SUBROUTINE cd_code_read_pickup  DEPEND = 1,2
CADJ SUBROUTINE cd_code_read_pickup  REQUIRED
CADJ SUBROUTINE cd_code_write_pickup  INPUT  = 1,2,3,4,5
CADJ SUBROUTINE cd_code_write_pickup  OUTPUT =
CADJ SUBROUTINE cd_code_write_pickup  DEPEND = 1,2,3,4,5
CADJ SUBROUTINE cd_code_write_pickup  REQUIRED
cadj SUBROUTINE ctrl_bound_3D FTLNAME = g_ctrl_bound_3D
cadj SUBROUTINE ctrl_bound_3D ADNAME  = adctrl_bound_3D
cadj SUBROUTINE ctrl_bound_3D INPUT   = 1,2,3,4
cadj SUBROUTINE ctrl_bound_3D OUTPUT  =
cadj SUBROUTINE ctrl_bound_3D ACTIVE  = 1     
cadj SUBROUTINE ctrl_bound_3D DEPEND  = 1,2,3,4
cadj SUBROUTINE ctrl_bound_2D FTLNAME = g_ctrl_bound_2D
cadj SUBROUTINE ctrl_bound_2D ADNAME  = adctrl_bound_2D
cadj SUBROUTINE ctrl_bound_2D INPUT   = 1,2,3,4
cadj SUBROUTINE ctrl_bound_2D OUTPUT  =
cadj SUBROUTINE ctrl_bound_2D ACTIVE  = 1 
cadj SUBROUTINE ctrl_bound_2D DEPEND  = 1,2,3,4
CADJ SUBROUTINE DEBUG_STATS_RL INPUT  = 1,2,3,4
CADJ SUBROUTINE DEBUG_STATS_RL OUTPUT =
CADJ SUBROUTINE DEBUG_STATS_RS INPUT  = 1,2,3,4
CADJ SUBROUTINE DEBUG_STATS_RS  OUTPUT =
CADJ SUBROUTINE DEBUG_CALL INPUT  = 1,2
CADJ SUBROUTINE DEBUG_CALL  OUTPUT =
CADJ SUBROUTINE DEBUG_LEAVE INPUT  = 1,2
CADJ SUBROUTINE DEBUG_LEAVE  OUTPUT =
CADJ SUBROUTINE DEBUG_ENTER INPUT  = 1,2
CADJ SUBROUTINE DEBUG_ENTER  OUTPUT =
CADJ SUBROUTINE DEBUG_MSG INPUT  = 1,2
CADJ SUBROUTINE DEBUG_MSG  OUTPUT =
CADJ SUBROUTINE DEBUG_CS_CORNER_UV INPUT  = 1,2,3,4,5,6,7,8
CADJ SUBROUTINE DEBUG_CS_CORNER_UV  OUTPUT =
CADJ SUBROUTINE GMREDI_OUTPUT INPUT  = 1,2,3
CADJ SUBROUTINE GMREDI_OUTPUT OUTPUT =
CADJ SUBROUTINE GMREDI_DIAGNOSTICS_FILL INPUT  = 1,2,3
CADJ SUBROUTINE GMREDI_DIAGNOSTICS_FILL OUTPUT =
CADJ SUBROUTINE GMREDI_DIAGNOSTICS_FILL DEPEND = 1,2,3
CADJ SUBROUTINE GMREDI_DIAGNOSTICS_FILL REQUIRED
CADJ SUBROUTINE mds_read_field  INPUT  = 1,2,3,4,5,6,7,    10,11
CADJ SUBROUTINE mds_read_field  OUTPUT =               8,9
CADJ SUBROUTINE mds_read_field  DEPEND = 1,2,3,4,5,6,7,8,9,10,11
CADJ SUBROUTINE mds_read_field  REQUIRED
CADJ SUBROUTINE mds_write_field  INPUT  = 1,2,3,4,5,6,7,8,9,10,11,12,13
CADJ SUBROUTINE mds_write_field  OUTPUT =
cCADJ SUBROUTINE mds_read_rec_xz  INPUT  = 1,2,3,4,5,    8,9
cCADJ SUBROUTINE mds_read_rec_xz  OUTPUT =           6,7
cCADJ SUBROUTINE mds_read_rec_xz  DEPEND = 1,2,3,4,5,6,7,8,9
cCADJ SUBROUTINE mds_read_rec_xz  REQUIRED
cCADJ SUBROUTINE mds_read_rec_yz  INPUT  = 1,2,3,4,5,    8,9
cCADJ SUBROUTINE mds_read_rec_yz  OUTPUT =           6,7
cCADJ SUBROUTINE mds_read_rec_yz  DEPEND = 1,2,3,4,5,6,7,8,9
cCADJ SUBROUTINE mds_read_rec_yz  REQUIRED
CADJ SUBROUTINE mds_read_sec_xz  INPUT  = 1,2,3,4,5,    8,9
CADJ SUBROUTINE mds_read_sec_xz  OUTPUT =           6,7
CADJ SUBROUTINE mds_read_sec_xz  DEPEND = 1,2,3,4,5,6,7,8,9
CADJ SUBROUTINE mds_read_sec_xz  REQUIRED
CADJ SUBROUTINE mds_read_sec_yz  INPUT  = 1,2,3,4,5,    8,9
CADJ SUBROUTINE mds_read_sec_yz  OUTPUT =           6,7
CADJ SUBROUTINE mds_read_sec_yz  DEPEND = 1,2,3,4,5,6,7,8,9
CADJ SUBROUTINE mds_read_sec_yz  REQUIRED
CADJ SUBROUTINE mds_write_sec_xz  INPUT  = 1,2,3,4,5,6,7,8,9,10,11
CADJ SUBROUTINE mds_write_sec_xz  OUTPUT =
CADJ SUBROUTINE mds_write_sec_yz  INPUT  = 1,2,3,4,5,6,7,8,9,10,11
CADJ SUBROUTINE mds_write_sec_yz  OUTPUT =
CADJ SUBROUTINE mdsreadfield  INPUT  = 1,2,3,4,  6,7
CADJ SUBROUTINE mdsreadfield  OUTPUT =         5
CADJ SUBROUTINE mdsreadfield  DEPEND = 1,2,3,4,5,6,7
CADJ SUBROUTINE mdsreadfield  REQUIRED
CADJ SUBROUTINE mdswritefield  INPUT  = 1,2,3,4,5,6,7,8,9
CADJ SUBROUTINE mdswritefield  OUTPUT =
CADJ SUBROUTINE mdsreadvector  INPUT  = 1,2,3,4,  6,7,8,9
CADJ SUBROUTINE mdsreadvector  OUTPUT =         5
CADJ SUBROUTINE mdswritevector  INPUT  = 1,2,3,4,5,6,7,8,9,10,11
CADJ SUBROUTINE mdswritevector  OUTPUT =
CADJ SUBROUTINE mdsreadfieldxz  INPUT  = 1,2,3,4,  6,7
CADJ SUBROUTINE mdsreadfieldxz  OUTPUT =         5
CADJ SUBROUTINE mdswritefieldxz  INPUT  = 1,2,3,4,5,6,7,8,9
CADJ SUBROUTINE mdswritefieldxz  OUTPUT =
CADJ SUBROUTINE mdsreadfieldyz  INPUT  = 1,2,3,4,  6,7
CADJ SUBROUTINE mdsreadfieldyz  OUTPUT =         5
CADJ SUBROUTINE mdswritefieldyz  INPUT  = 1,2,3,4,5,6,7,8,9
CADJ SUBROUTINE mdswritefieldyz  OUTPUT =
CADJ SUBROUTINE mdsreadfield_loc  INPUT  = 1,2,3,4,  6,7
CADJ SUBROUTINE mdsreadfield_loc  OUTPUT =         5
CADJ SUBROUTINE mdsreadfield_loc  DEPEND = 1,2,3,4,5,6,7
CADJ SUBROUTINE mdsreadfield_loc  REQUIRED
CADJ SUBROUTINE mdswritefield_loc  INPUT  = 1,2,3,4,5,6,7,8,9
CADJ SUBROUTINE mdswritefield_loc  OUTPUT =
CADJ SUBROUTINE mdsreadfieldxz_loc  INPUT  = 1,2,3,4,  6,7
CADJ SUBROUTINE mdsreadfieldxz_loc  OUTPUT =         5
CADJ SUBROUTINE mdswritefieldxz_loc  INPUT  = 1,2,3,4,5,6,7,8,9
CADJ SUBROUTINE mdswritefieldxz_loc  OUTPUT =
CADJ SUBROUTINE mdsreadfieldyz_loc  INPUT  = 1,2,3,4,  6,7
CADJ SUBROUTINE mdsreadfieldyz_loc  OUTPUT =         5
CADJ SUBROUTINE mdswritefieldyz_loc  INPUT  = 1,2,3,4,5,6,7,8,9
CADJ SUBROUTINE mdswritefieldyz_loc  OUTPUT =
CADJ SUBROUTINE MDS_FACEF_READ_RS  INPUT  = 1,2,3,4,5,6,7
CADJ SUBROUTINE MDS_FACEF_READ_RS  OUTPUT =       4
CADJ SUBROUTINE MONITOR INPUT  = 1,2,3
CADJ SUBROUTINE MONITOR OUTPUT =
CADJ SUBROUTINE MONITOR DEPEND = 1,2,3
CADJ SUBROUTINE MONITOR REQUIRED
CADJ SUBROUTINE MONITOR ACTIVE  =
CADJ SUBROUTINE MONITOR INFLUENCED
CADJ SUBROUTINE MONITOR ADNAME  = admonitor
CADJ SUBROUTINE MONITOR FTLNAME = g_monitor
CADJ SUBROUTINE MON_SET_PREF INPUT  = 1,2
CADJ SUBROUTINE MON_SET_PREF OUTPUT =
CADJ SUBROUTINE MON_PRINTSTATS_RS INPUT  = 1,2,3,4
CADJ SUBROUTINE MON_PRINTSTATS_RS OUTPUT =
CADJ SUBROUTINE set_write_global_fld    INPUT  = 1
CADJ SUBROUTINE set_write_global_fld    OUTPUT =
CADJ SUBROUTINE write_fld_xy_rs   INPUT  = 1,2,3,4,5
CADJ SUBROUTINE write_fld_xy_rs   OUTPUT =
CADJ SUBROUTINE write_fld_xy_rl   INPUT  = 1,2,3,4,5
CADJ SUBROUTINE write_fld_xy_rl   OUTPUT =
CADJ SUBROUTINE write_fld_xyz_rs  INPUT  = 1,2,3,4,5
CADJ SUBROUTINE write_fld_xyz_rs  OUTPUT =
CADJ SUBROUTINE write_fld_xyz_rl  INPUT  = 1,2,3,4,5
CADJ SUBROUTINE write_fld_xyz_rl  OUTPUT =
CADJ SUBROUTINE write_local_rl  INPUT  = 1,2,3,4,5,6,7,8,9
CADJ SUBROUTINE write_local_rl  OUTPUT =
CADJ SUBROUTINE write_local_rs  INPUT  = 1,2,3,4,5,6,7,8,9
CADJ SUBROUTINE write_local_rs  OUTPUT =
CADJ SUBROUTINE set_write_global_rec  INPUT  = 1
CADJ SUBROUTINE set_write_global_rec  OUTPUT =
CADJ SUBROUTINE write_rec_xy_rl   INPUT  = 1,2,3,4,5
CADJ SUBROUTINE write_rec_xy_rl   OUTPUT =
CADJ SUBROUTINE write_rec_xyz_rs  INPUT  = 1,2,3,4,5
CADJ SUBROUTINE write_rec_xyz_rs  OUTPUT =
CADJ SUBROUTINE write_rec_xyz_rl  INPUT  = 1,2,3,4,5
CADJ SUBROUTINE write_rec_xyz_rl  OUTPUT =
CADJ SUBROUTINE write_rec_3d_rs  INPUT  = 1,2,3,4,5,6,7
CADJ SUBROUTINE write_rec_3d_rs  OUTPUT =
CADJ SUBROUTINE write_rec_3d_rl  INPUT  = 1,2,3,4,5,6,7
CADJ SUBROUTINE write_rec_3d_rl  OUTPUT =
CADJ SUBROUTINE write_rec_lev_rs  INPUT  = 1,2,3,4,5,6,7,8,9
CADJ SUBROUTINE write_rec_lev_rs  OUTPUT =
CADJ SUBROUTINE write_rec_lev_rl  INPUT  = 1,2,3,4,5,6,7,8,9
CADJ SUBROUTINE write_rec_lev_rl  OUTPUT =
CADJ SUBROUTINE write_rec_xz_rs  INPUT  = 1,2,3,4,5,6,7
CADJ SUBROUTINE write_rec_xz_rs  OUTPUT =
CADJ SUBROUTINE write_rec_xz_rl  INPUT  = 1,2,3,4,5,6,7
CADJ SUBROUTINE write_rec_xz_rl  OUTPUT =
CADJ SUBROUTINE write_rec_yz_rs  INPUT  = 1,2,3,4,5,6,7
CADJ SUBROUTINE write_rec_yz_rs  OUTPUT =
CADJ SUBROUTINE write_rec_yz_rl  INPUT  = 1,2,3,4,5,6,7
CADJ SUBROUTINE write_rec_yz_rl  OUTPUT =
CADJ SUBROUTINE WRITE_GLVEC_RS  INPUT  = 1,2,3,4,5,6
CADJ SUBROUTINE WRITE_GLVEC_RS  OUTPUT =
CADJ SUBROUTINE WRITE_GLVEC_RL  INPUT  = 1,2,3,4,5,6
CADJ SUBROUTINE WRITE_GLVEC_RL  OUTPUT =
CADJ SUBROUTINE READ_MFLDS_CHECK  INPUT  =   2,3,4
CADJ SUBROUTINE READ_MFLDS_CHECK  OUTPUT = 1,2
CADJ SUBROUTINE READ_MFLDS_INIT  INPUT  = 1
CADJ SUBROUTINE READ_MFLDS_INIT  OUTPUT =
CADJ SUBROUTINE READ_MFLDS_SET  INPUT  = 1,   4,5,6
CADJ SUBROUTINE READ_MFLDS_SET  OUTPUT =   2,3
CADJ SUBROUTINE READ_MFLDS_3D_RL  INPUT  = 1,  3,4,5,6,7
CADJ SUBROUTINE READ_MFLDS_3D_RL  OUTPUT =   2,3
CADJ SUBROUTINE READ_MFLDS_LEV_RL  INPUT  = 1,  3,4,5,6,7,8,9
CADJ SUBROUTINE READ_MFLDS_LEV_RL  OUTPUT =   2,3
CADJ SUBROUTINE BARRIER INPUT   = 1
CADJ SUBROUTINE BARRIER OUTPUT  =
CADJ SUBROUTINE BARRIER REQUIRED
CADJ SUBROUTINE BARRIER INFLUENCED
CADJ SUBROUTINE BARRIER ADNAME  = BARRIER
CADJ SUBROUTINE BARRIER FTLNAME = BARRIER
CADJ SUBROUTINE BARRIER DEPEND  = 1
CADJ SUBROUTINE FOOL_THE_COMPILER INPUT   = 1
CADJ SUBROUTINE FOOL_THE_COMPILER OUTPUT  =
CADJ SUBROUTINE FOOL_THE_COMPILER REQUIRED
CADJ SUBROUTINE FOOL_THE_COMPILER INFLUENCED
CADJ SUBROUTINE FOOL_THE_COMPILER ADNAME  = FOOL_THE_COMPILER
CADJ SUBROUTINE FOOL_THE_COMPILER FTLNAME = FOOL_THE_COMPILER
CADJ SUBROUTINE FOOL_THE_COMPILER DEPEND  = 1
CADJ SUBROUTINE MEMSYNC INPUT   =
CADJ SUBROUTINE MEMSYNC OUTPUT  =
CADJ SUBROUTINE MEMSYNC REQUIRED
CADJ SUBROUTINE MEMSYNC INFLUENCED
CADJ SUBROUTINE MEMSYNC ADNAME  = MEMSYNC
CADJ SUBROUTINE MEMSYNC FTLNAME = MEMSYNC
CADJ SUBROUTINE MEMSYNC DEPEND  =
CADJ SUBROUTINE BARRIER_INIT  INPUT  =
CADJ SUBROUTINE BARRIER_INIT  OUTPUT =
CADJ SUBROUTINE BAR2       INPUT  = 1
CADJ SUBROUTINE BAR2       OUTPUT =
CADJ SUBROUTINE BAR2_INIT  INPUT  = 1
CADJ SUBROUTINE BAR2_INIT  OUTPUT =
CADJ SUBROUTINE BAR_CHECK  INPUT = 1,2
CADJ SUBROUTINE BAR_CHECK  OUTPUT = 
CADJ SUBROUTINE CHECK_THREADS  INPUT  = 1
CADJ SUBROUTINE CHECK_THREADS  OUTPUT = 
CADJ SUBROUTINE EEDIE  INPUT  =
CADJ SUBROUTINE EEDIE  OUTPUT =
CADJ SUBROUTINE ALL_PROC_DIE  INPUT  = 1
CADJ SUBROUTINE ALL_PROC_DIE  OUTPUT =
CADJ FUNCTION   TIMER_INDEX  INPUT  = 1,2,3,4
CADJ FUNCTION   TIMER_INDEX  OUTPUT =
CADJ SUBROUTINE TIMER_CONTROL  INPUT  = 1,2,3,4
CADJ SUBROUTINE TIMER_CONTROL  OUTPUT =
CADJ SUBROUTINE TIMER_GET_TIME INPUT  =
CADJ SUBROUTINE TIMER_GET_TIME OUTPUT = 1,2,3
CADJ SUBROUTINE TIMER_PRINTALL INPUT  = 1
CADJ SUBROUTINE TIMER_PRINTALL OUTPUT =
CADJ SUBROUTINE TIMER_START    INPUT  = 1,2
CADJ SUBROUTINE TIMER_START    OUTPUT =
CADJ SUBROUTINE TIMER_STOP     INPUT  = 1,2
CADJ SUBROUTINE TIMER_STOP     OUTPUT =
CADJ SUBROUTINE PAPIF_flops    INPUT =
CADJ SUBROUTINE PAPIF_flops    OUTPUT = 1,2,3,4,5
CADJ SUBROUTINE PAPIF_flips    INPUT =
CADJ SUBROUTINE PAPIF_flips    OUTPUT = 1,2,3,4,5
CADJ SUBROUTINE PAPIF_ipc      INPUT =
CADJ SUBROUTINE PAPIF_ipc      OUTPUT = 1,2,3,4,5
CADJ FUNCTION   PCLstart       INPUT = 1,2,3,4
CADJ FUNCTION   PCLstart       OUTPUT =
CADJ FUNCTION   PCLstop        INPUT = 1,4
CADJ FUNCTION   PCLstop        OUTPUT = 2,3
CADJ SUBROUTINE DATE  INPUT  = 2
CADJ SUBROUTINE DATE  OUTPUT = 1
CADJ SUBROUTINE LCASE  INPUT  = 1
CADJ SUBROUTINE LCASE  OUTPUT = 1
CADJ SUBROUTINE UCASE  INPUT  = 1
CADJ SUBROUTINE UCASE  OUTPUT = 1
CADJ SUBROUTINE MACHINE  INPUT  =
CADJ SUBROUTINE MACHINE  OUTPUT = 1
CADJ FUNCTION   IFNBLNK  INPUT  = 1
CADJ FUNCTION   IFNBLNK  OUTPUT =
CADJ FUNCTION   ILNBLNK  INPUT  = 1
CADJ FUNCTION   ILNBLNK  OUTPUT =
CADJ FUNCTION   IO_ERRCOUNT  INPUT  = 1
CADJ FUNCTION   IO_ERRCOUNT  OUTPUT =
CADJ SUBROUTINE READ_FIELD_XYZR8  INPUT  = 2,3,4
CADJ SUBROUTINE READ_FIELD_XYZR8  OUTPUT = 1
CADJ SUBROUTINE WRITE_FIELD_XYZR8  INPUT  = 1,2,3,4
CADJ SUBROUTINE WRITE_FIELD_XYZR8  OUTPUT =
CADJ SUBROUTINE PRINT_MESSAGE  INPUT  = 1,2,3,4
CADJ SUBROUTINE PRINT_MESSAGE  OUTPUT =
CADJ SUBROUTINE PRINT_ERROR   INPUT  = 1,2
CADJ SUBROUTINE PRINT_ERROR   OUTPUT =
CADJ SUBROUTINE PRINT_LIST_I  INPUT  = 1,2,3,4,5,6,7
CADJ SUBROUTINE PRINT_LIST_I  OUTPUT =
CADJ SUBROUTINE PRINT_LIST_L  INPUT  = 1,2,3,4,5,6,7
CADJ SUBROUTINE PRINT_LIST_L  OUTPUT =
CADJ SUBROUTINE PRINT_LIST_RL INPUT  = 1,2,3,4,5,6,7
CADJ SUBROUTINE PRINT_LIST_RL OUTPUT =
CADJ SUBROUTINE PRINT_MAPRS INPUT  = 1,2,3,4,5,6,7,8,9,10
CADJ SUBROUTINE PRINT_MAPRS INPUT += 11,12,13,14,15,16,17,18,19,20
CADJ SUBROUTINE PRINT_MAPRS INPUT += 21,22,23,24,25,26
CADJ SUBROUTINE PRINT_MAPRS OUTPUT =
CADJ SUBROUTINE PRINT_MAPRL INPUT  = 1,2,3,4,5,6,7,8,9,10
CADJ SUBROUTINE PRINT_MAPRL INPUT += 11,12,13,14,15,16,17,18,19,20
CADJ SUBROUTINE PRINT_MAPRL INPUT += 21,22,23,24,25,26
CADJ SUBROUTINE PRINT_MAPRL OUTPUT =
CADJ SUBROUTINE NML_FILTER  INPUT  = 1,2,3
CADJ SUBROUTINE NML_FILTER  OUTPUT =
CADJ SUBROUTINE  mdsfindunit   INPUT  =   2
CADJ SUBROUTINE  mdsfindunit   OUTPUT = 1
CADJ SUBROUTINE mds_byteswapr8  INPUT  = 1,2
CADJ SUBROUTINE mds_byteswapr8  OUTPUT = 2
CADJ SUBROUTINE mds_byteswapr4  INPUT  = 1,2
CADJ SUBROUTINE mds_byteswapr4  OUTPUT = 2
CADJ FUNCTION   MASTER_CPU_IO   INPUT  = 1
CADJ FUNCTION   MASTER_CPU_IO   OUTPUT =
CADJ FUNCTION   MASTER_CPU_THREAD  INPUT  = 1
CADJ FUNCTION   MASTER_CPU_THREAD  OUTPUT =
CADJ SUBROUTINE OPEN_COPY_DATA_FILE  INPUT  = 1,2,  4
CADJ SUBROUTINE OPEN_COPY_DATA_FILE  OUTPUT =     3
CADJ SUBROUTINE WRITE_1D_I  INPUT  = 1,2,3,4,5
CADJ SUBROUTINE WRITE_1D_I  OUTPUT =
CADJ SUBROUTINE WRITE_1D_L  INPUT  = 1,2,3,4,5
CADJ SUBROUTINE WRITE_1D_L  OUTPUT =
CADJ SUBROUTINE WRITE_1D_RL INPUT  = 1,2,3,4,5
CADJ SUBROUTINE WRITE_1D_RL OUTPUT =
CADJ SUBROUTINE WRITE_0D_I INPUT  = 1,2,3,4
CADJ SUBROUTINE WRITE_0D_I OUTPUT =
CADJ SUBROUTINE WRITE_0D_L INPUT  = 1,2,3,4
CADJ SUBROUTINE WRITE_0D_L OUTPUT =
CADJ SUBROUTINE WRITE_0D_R4 INPUT  = 1,2,3,4
CADJ SUBROUTINE WRITE_0D_R4 OUTPUT =
CADJ SUBROUTINE WRITE_0D_R8 INPUT  = 1,2,3,4
CADJ SUBROUTINE WRITE_0D_R8 OUTPUT =
CADJ SUBROUTINE WRITE_0D_RS INPUT  = 1,2,3,4
CADJ SUBROUTINE WRITE_0D_RS OUTPUT =
CADJ SUBROUTINE WRITE_0D_RL INPUT  = 1,2,3,4
CADJ SUBROUTINE WRITE_0D_RL OUTPUT =
CADJ SUBROUTINE WRITE_0D_C INPUT  = 1,2,3,4,5
CADJ SUBROUTINE WRITE_0D_C OUTPUT =
CADJ SUBROUTINE WRITE_COPY1D_R4 INPUT  =   2,3,4,5,6
CADJ SUBROUTINE WRITE_COPY1D_R4 OUTPUT = 1
CADJ SUBROUTINE WRITE_COPY1D_R8 INPUT  =   2,3,4,5,6
CADJ SUBROUTINE WRITE_COPY1D_R8 OUTPUT = 1
CADJ SUBROUTINE WRITE_COPY1D_RS INPUT  =   2,3,4,5,6
CADJ SUBROUTINE WRITE_COPY1D_RS OUTPUT = 1
c$taf SUBROUTINE exch1_rl   INPUT = 1,2,3,4,5,6,7,8,9,10
c$taf SUBROUTINE exch1_rl  OUTPUT = 1
c$taf SUBROUTINE exch1_rl  ACTIVE = 1
c$taf SUBROUTINE exch1_rl  DEPEND =   2,3,4,5,6,7,8,9,10
c$taf SUBROUTINE exch1_rl  ADNAME = exch1_rl_ad
c$taf SUBROUTINE exch1_rl FTLNAME = exch1_rl
c$taf SUBROUTINE exch1_rs   INPUT = 1,2,3,4,5,6,7,8,9,10
c$taf SUBROUTINE exch1_rs  OUTPUT = 1
c$taf SUBROUTINE exch1_rs  ACTIVE = 1
c$taf SUBROUTINE exch1_rs  DEPEND =   2,3,4,5,6,7,8,9,10
c$taf SUBROUTINE exch1_rs  ADNAME = exch1_rs_ad
c$taf SUBROUTINE exch1_rs FTLNAME = exch1_rs
c$taf SUBROUTINE exch1_rl_cube   INPUT = 1,2,3,4,5,6,7,8,9,10,11
c$taf SUBROUTINE exch1_rl_cube  OUTPUT = 1
c$taf SUBROUTINE exch1_rl_cube  ACTIVE = 1
c$taf SUBROUTINE exch1_rl_cube  DEPEND =   2,3,4,5,6,7,8,9,10,11
c$taf SUBROUTINE exch1_rl_cube  ADNAME = exch1_rl_cube_ad
c$taf SUBROUTINE exch1_rl_cube FTLNAME = exch1_rl_cube
c$taf SUBROUTINE exch1_rs_cube   INPUT = 1,2,3,4,5,6,7,8,9,10,11
c$taf SUBROUTINE exch1_rs_cube  OUTPUT = 1
c$taf SUBROUTINE exch1_rs_cube  ACTIVE = 1
c$taf SUBROUTINE exch1_rs_cube  DEPEND =   2,3,4,5,6,7,8,9,10,11
c$taf SUBROUTINE exch1_rs_cube  ADNAME = exch1_rs_cube_ad
c$taf SUBROUTINE exch1_rs_cube FTLNAME = exch1_rs_cube
c$taf SUBROUTINE exch1_z_rl_cube   INPUT = 1,2,3,4,5,6,7,8,9,10,11
c$taf SUBROUTINE exch1_z_rl_cube  OUTPUT = 1
c$taf SUBROUTINE exch1_z_rl_cube  ACTIVE = 1
c$taf SUBROUTINE exch1_z_rl_cube  DEPEND =   2,3,4,5,6,7,8,9,10,11
c$taf SUBROUTINE exch1_z_rl_cube  ADNAME = exch1_rl_cube_ad
c$taf SUBROUTINE exch1_z_rl_cube FTLNAME = exch1_rl_cube
c$taf SUBROUTINE exch1_z_rs_cube   INPUT = 1,2,3,4,5,6,7,8,9,10,11
c$taf SUBROUTINE exch1_z_rs_cube  OUTPUT = 1
c$taf SUBROUTINE exch1_z_rs_cube  ACTIVE = 1
c$taf SUBROUTINE exch1_z_rs_cube  DEPEND =   2,3,4,5,6,7,8,9,10,11
c$taf SUBROUTINE exch1_z_rs_cube  ADNAME = exch1_rs_cube_ad
c$taf SUBROUTINE exch1_z_rs_cube FTLNAME = exch1_rs_cube
c$taf SUBROUTINE exch1_uv_rl_cube   INPUT = 1,2,3,4,5,6,7,8,9,10,11,12
c$taf SUBROUTINE exch1_uv_rl_cube  OUTPUT = 1,2
c$taf SUBROUTINE exch1_uv_rl_cube  ACTIVE = 1,2
c$taf SUBROUTINE exch1_uv_rl_cube  DEPEND =     3,4,5,6,7,8,9,10,11,12
c$taf SUBROUTINE exch1_uv_rl_cube  ADNAME = exch1_rl_cube_ad
c$taf SUBROUTINE exch1_uv_rl_cube FTLNAME = exch1_rl_cube
c$taf SUBROUTINE exch1_uv_rs_cube   INPUT = 1,2,3,4,5,6,7,8,9,10,11,12
c$taf SUBROUTINE exch1_uv_rs_cube  OUTPUT = 1,2
c$taf SUBROUTINE exch1_uv_rs_cube  ACTIVE = 1,2
c$taf SUBROUTINE exch1_uv_rs_cube  DEPEND =     3,4,5,6,7,8,9,10,11,12
c$taf SUBROUTINE exch1_uv_rs_cube  ADNAME = exch1_rs_cube_ad
c$taf SUBROUTINE exch1_uv_rs_cube FTLNAME = exch1_rs_cube
c$taf SUBROUTINE exch1_uv_rl_cube   INPUT = 1,2,3,4,5,6,7,8,9,10,11,12
c$taf SUBROUTINE exch1_uv_rl_cube  OUTPUT = 1,2
c$taf SUBROUTINE exch1_uv_rl_cube  ACTIVE = 1,2
c$taf SUBROUTINE exch1_uv_rl_cube  DEPEND =     3,4,5,6,7,8,9,10,11,12
c$taf SUBROUTINE exch1_uv_rl_cube  ADNAME = exch1_rl_cube_ad
c$taf SUBROUTINE exch1_uv_rl_cube FTLNAME = exch1_rl_cube
c$taf SUBROUTINE exch1_uv_rs_cube   INPUT = 1,2,3,4,5,6,7,8,9,10,11,12
c$taf SUBROUTINE exch1_uv_rs_cube  OUTPUT = 1,2
c$taf SUBROUTINE exch1_uv_rs_cube  ACTIVE = 1,2
c$taf SUBROUTINE exch1_uv_rs_cube  DEPEND =     3,4,5,6,7,8,9,10,11,12
c$taf SUBROUTINE exch1_uv_rs_cube  ADNAME = exch1_rs_cube_ad
c$taf SUBROUTINE exch1_uv_rs_cube FTLNAME = exch1_rs_cube
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE COST_TEMP( myThid )
       IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
c
c
c
c
c
      common /cost_r/
     &                fc
      Real*8  fc
      common /cost_objf/
     &                objf_atl,
     &                objf_test,
     &                objf_tracer,
     &                objf_entropy,
     &                objf_t_misfit,
     &                objf_eflux
cHFLUXM_CONTROL
     &               ,objf_hflux_tut
     &               ,objf_temp_tut
cHFLUXM_CONTROL
      Real*8  objf_atl  (nsx,nsy)
      Real*8  objf_test (nsx,nsy)
      Real*8  objf_tracer (nsx,nsy)
      Real*8  objf_entropy (nsx,nsy)
      Real*8  objf_t_misfit (nsx,nsy)
      Real*8  objf_eflux (nsx,nsy)
cHFLUXM_CONTROL
      Real*8  objf_hflux_tut (nsx,nsy)
      Real*8  objf_temp_tut (nsx,nsy)
cHFLUXM_CONTROL
      common /cost_param_r/
     &                lastinterval
      Real*8 lastinterval
      common /cost_aux_r/
     &                    mult_atl,
     &                    mult_test,
     &                    mult_tracer,
     &                    mult_entropy,
     &                    mult_t_misfit,
     &                    mult_eflux,
     &                    multTheta,
     &                    multSalt,
     &                    multUvel,
     &                    multVvel,
     &                    multEtan
cHFLUXM_CONTROL
     &                   ,mult_hflux_tut
     &                   ,mult_temp_tut
cHFLUXM_CONTROL
      Real*8  mult_atl
      Real*8  mult_test
      Real*8  mult_tracer
      Real*8  mult_entropy
      Real*8  mult_t_misfit
      Real*8  mult_eflux
      Real*8  multTheta
      Real*8  multSalt
      Real*8  multUvel
      Real*8  multVvel
      Real*8  multEtan
cHFLUXM_CONTROL
      Real*8  mult_hflux_tut
      Real*8  mult_temp_tut
cHFLUXM_CONTROL
      COMMON /COST_MEAN_R/
     &                     cMeanTheta, cMeanUVel, cMeanVVel,
     &                     cMeanThetaUVel, cMeanThetaVVel
      Real*8 cMeanTheta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      common /ctrl_weights_dummy_r/
     &                        wtheta, wsalt,
     &                        wuvvel, wetan,
     &                        wdiffkr, wkapgm, wkapredi,
     &                        wedtaux, wedtauy
      Real*8 wtheta   ( nr,nsx,nsy )
      Real*8 wsalt    ( nr,nsx,nsy )
      Real*8 wuvvel   ( nr,nsx,nsy )
      Real*8 wetan    ( snx,sny,nsx,nsy )
      Real*8 wdiffkr ( nr,nsx,nsy )
      Real*8 wkapgm ( nr,nsx,nsy )
      Real*8 wkapredi ( nr,nsx,nsy )
      Real*8 wedtaux ( nr,nsx,nsy )
      Real*8 wedtauy ( nr,nsx,nsy )
      common /cost_weights_r/ whfluxm
      Real*8 whfluxm (1-olx:snx+olx,1-oly:sny+oly,   nsx,nsy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      INTEGER myThid
      INTEGER i, j, k
      INTEGER bi, bj
      INTEGER Nk
      Real*8 locfc,tmp
      Real*8 thetalev(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Nk = 2
      CALL READ_FLD_XYZ_RL('lev_t_an.bin',' ',thetalev,0,myThid)
      tmp  = 0.d0
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
         DO k=1, Nk
          DO j=1,sNy
           DO i=1,sNx
             tmp = tmp + maskC(i,j,k,bi,bj)
           ENDDO
          ENDDO
         ENDDO
       ENDDO
      ENDDO
      CALL GLOBAL_SUM_R8 (  tmp ,  myThid  )
      IF ( tmp.GT.0. ) tmp = 1.d0 / tmp
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
         act1 = bi - myBxLo(myThid)
         max1 = myBxHi(myThid) - myBxLo(myThid) + 1
         act2 = bj - myByLo(myThid)
         max2 = myByHi(myThid) - myByLo(myThid) + 1
         act3 = myThid - 1
         ikey = (act1 + 1) + act2*max1
     &                     + act3*max1*max2
         locfc = 0.d0
         DO k=1,Nk
           DO j=1,sNy
            DO i=1,sNx
              locfc = locfc + tmp*maskC(i,j,k,bi,bj)*
     &         wtheta(k,bi,bj)*
     &         ( cMeanTheta(i,j,k,bi,bj) - thetalev(i,j,k,bi,bj) )**2
            ENDDO
           ENDDO
         ENDDO
         objf_temp_tut(bi,bj) = locfc
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE COST_HFLUX( myThid )
       IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
c
c
c
c
c
      common /cost_r/
     &                fc
      Real*8  fc
      common /cost_objf/
     &                objf_atl,
     &                objf_test,
     &                objf_tracer,
     &                objf_entropy,
     &                objf_t_misfit,
     &                objf_eflux
cHFLUXM_CONTROL
     &               ,objf_hflux_tut
     &               ,objf_temp_tut
cHFLUXM_CONTROL
      Real*8  objf_atl  (nsx,nsy)
      Real*8  objf_test (nsx,nsy)
      Real*8  objf_tracer (nsx,nsy)
      Real*8  objf_entropy (nsx,nsy)
      Real*8  objf_t_misfit (nsx,nsy)
      Real*8  objf_eflux (nsx,nsy)
cHFLUXM_CONTROL
      Real*8  objf_hflux_tut (nsx,nsy)
      Real*8  objf_temp_tut (nsx,nsy)
cHFLUXM_CONTROL
      common /cost_param_r/
     &                lastinterval
      Real*8 lastinterval
      common /cost_aux_r/
     &                    mult_atl,
     &                    mult_test,
     &                    mult_tracer,
     &                    mult_entropy,
     &                    mult_t_misfit,
     &                    mult_eflux,
     &                    multTheta,
     &                    multSalt,
     &                    multUvel,
     &                    multVvel,
     &                    multEtan
cHFLUXM_CONTROL
     &                   ,mult_hflux_tut
     &                   ,mult_temp_tut
cHFLUXM_CONTROL
      Real*8  mult_atl
      Real*8  mult_test
      Real*8  mult_tracer
      Real*8  mult_entropy
      Real*8  mult_t_misfit
      Real*8  mult_eflux
      Real*8  multTheta
      Real*8  multSalt
      Real*8  multUvel
      Real*8  multVvel
      Real*8  multEtan
cHFLUXM_CONTROL
      Real*8  mult_hflux_tut
      Real*8  mult_temp_tut
cHFLUXM_CONTROL
      COMMON /COST_MEAN_R/
     &                     cMeanTheta, cMeanUVel, cMeanVVel,
     &                     cMeanThetaUVel, cMeanThetaVVel
      Real*8 cMeanTheta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      common /ctrl_weights_dummy_r/
     &                        wtheta, wsalt,
     &                        wuvvel, wetan,
     &                        wdiffkr, wkapgm, wkapredi,
     &                        wedtaux, wedtauy
      Real*8 wtheta   ( nr,nsx,nsy )
      Real*8 wsalt    ( nr,nsx,nsy )
      Real*8 wuvvel   ( nr,nsx,nsy )
      Real*8 wetan    ( snx,sny,nsx,nsy )
      Real*8 wdiffkr ( nr,nsx,nsy )
      Real*8 wkapgm ( nr,nsx,nsy )
      Real*8 wkapredi ( nr,nsx,nsy )
      Real*8 wedtaux ( nr,nsx,nsy )
      Real*8 wedtauy ( nr,nsx,nsy )
      common /cost_weights_r/ whfluxm
      Real*8 whfluxm (1-olx:snx+olx,1-oly:sny+oly,   nsx,nsy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      integer myThid
      integer i, j
      integer bi, bj
      Real*8     locfc,tmpC
      tmpC = 0.d0
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
         do j=1,sNy
           do i=1,sNx
             tmpC = tmpC + maskC(i,j,1,bi,bj)
           ENDDO
         ENDDO
       ENDDO
      ENDDO
      CALL GLOBAL_SUM_R8 (  tmpC ,  myThid  )
      IF ( tmpC.GT.0. ) tmpC = 1.d0 / tmpC
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
         act1 = bi - myBxLo(myThid)
         max1 = myBxHi(myThid) - myBxLo(myThid) + 1
         act2 = bj - myByLo(myThid)
         max2 = myByHi(myThid) - myByLo(myThid) + 1
         act3 = myThid - 1
         ikey = (act1 + 1) + act2*max1
     &                      + act3*max1*max2
         locfc = 0.d0
         DO j=1,sNy
          DO i=1,sNx
            locfc = locfc + tmpC*maskC(i,j,1,bi,bj)*
     &         whfluxm(i,j,bi,bj)*
     &        (
     &         Qnetm(i,j,bi,bj)
     &        )**2
          ENDDO
         ENDDO
         objf_hflux_tut(bi,bj) = locfc
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      subroutine autodiff_store( mythid )
c
c
c
      implicit none
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      integer ilev_1
      integer ilev_2
      integer ilev_3
      integer ilev_4
      integer max_lev2
      integer max_lev3
      integer max_lev4
      integer NDV3D, NDV2D, NEXF1, NEXF2, NCTRL1, NOB, NSI
      PARAMETER (NDV3D  = 12)
      PARAMETER (NDV2D  = 23)
      PARAMETER (NEXF1  = 21)
      PARAMETER (NEXF2  = 18)
      PARAMETER (NCTRL1 = 18)
      PARAMETER (NOB = 18)
      PARAMETER (NSI = 19)
      Real*8 StoreDynVars3D
     &    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy,NDV3D)
      Real*8 StoreDynVars2D
     &    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy,NDV2D)
      Real*8 StoreEXF1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy,NEXF1)
      Real*8 StoreEXF2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy,NEXF2)
      Real*8 StoreCTRLS1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy,NCTRL1)
      Real*8 StoreOBCSN(1-Olx:sNx+Olx,Nr,nSx,nSy,NOB)
      Real*8 StoreOBCSS(1-Olx:sNx+Olx,Nr,nSx,nSy,NOB)
      Real*8 StoreOBCSE(1-OLy:sNy+OLy,Nr,nSx,nSy,NOB)
      Real*8 StoreOBCSW(1-OLy:sNy+OLy,Nr,nSx,nSy,NOB)
      Real*8 StoreSEAICE(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy,NSI)
      COMMON /AUTODIFF_STORE_DYN/
     &       StoreDynVars3D,
     &       StoreDynVars2D
      COMMON /AUTODIFF_STORE_EXF_FLUX/
     &       StoreEXF1
      COMMON /AUTODIFF_STORE_EXF_ATMOS/
     &       StoreEXF2
      COMMON /AUTODIFF_STORE_CTRL/
     &       StoreCTRLS1
      COMMON /AUTODIFF_STORE_OBCSN/
     &       StoreOBCSN
      COMMON /AUTODIFF_STORE_OBCSS/
     &       StoreOBCSS
      COMMON /AUTODIFF_STORE_OBCSE/
     &       StoreOBCSE
      COMMON /AUTODIFF_STORE_OBCSW/
     &       StoreOBCSW
      COMMON /AUTODIFF_STORE_SEAICE/
     &       StoreSEAICE
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
      integer mythid 
      integer bi,bj
      integer I,J,K
       
      IF ( debugLevel .GE. debLevB ) 
     &    CALL DEBUG_ENTER('AUTODIFF_STORE',myThid)
          
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO J=1-Oly,sNy+Oly
         DO I=1-Olx,sNx+Olx
          StoreDynVars2D(I,J,bi,bj,1) = etan(I,J,bi,bj)
          StoreDynVars2D(I,J,bi,bj,2) = surfaceforcingTice(I,J,bi,bj)
          StoreDynVars2D(I,J,bi,bj,3) = taux0(I,J,bi,bj)
          StoreDynVars2D(I,J,bi,bj,4) = taux1(I,J,bi,bj)
          StoreDynVars2D(I,J,bi,bj,5) = tauy0(I,J,bi,bj)
          StoreDynVars2D(I,J,bi,bj,6) = tauy1(I,J,bi,bj)
          StoreDynVars2D(I,J,bi,bj,7) = qnet0(I,J,bi,bj)
          StoreDynVars2D(I,J,bi,bj,8) = qnet1(I,J,bi,bj)
          StoreDynVars2D(I,J,bi,bj,9)  = empmr0(I,J,bi,bj)
          StoreDynVars2D(I,J,bi,bj,10) = empmr1(I,J,bi,bj)
          StoreDynVars2D(I,J,bi,bj,11) = sst0(I,J,bi,bj)
          StoreDynVars2D(I,J,bi,bj,12) = sst1(I,J,bi,bj)
          StoreDynVars2D(I,J,bi,bj,13) = sss0(I,J,bi,bj)
          StoreDynVars2D(I,J,bi,bj,14) = sss1(I,J,bi,bj)
          StoreDynVars2D(I,J,bi,bj,15) = saltflux0(I,J,bi,bj)
          StoreDynVars2D(I,J,bi,bj,16) = saltflux1(I,J,bi,bj)
          StoreDynVars2D(I,J,bi,bj,17) = 0.
          StoreDynVars2D(I,J,bi,bj,18) = 0.
          StoreDynVars2D(I,J,bi,bj,19) = 0.
          StoreDynVars2D(I,J,bi,bj,20) = 0.
          StoreDynVars2D(I,J,bi,bj,21) = etaH(I,J,bi,bj)
          StoreDynVars2D(I,J,bi,bj,22) = dEtaHdt(I,J,bi,bj)
          StoreDynVars2D(I,J,bi,bj,23) = PmEpR(I,J,bi,bj)
         ENDDO
        ENDDO
        DO K=1,Nr
         DO J=1-Oly,sNy+Oly
          DO I=1-Olx,sNx+Olx
       StoreDynVars3D(I,J,K,bi,bj,1) = gs(I,J,K,bi,bj)
       StoreDynVars3D(I,J,K,bi,bj,2) = gt(I,J,K,bi,bj)             
       StoreDynVars3D(I,J,K,bi,bj,3) = gtnm1(I,J,K,bi,bj)
       StoreDynVars3D(I,J,K,bi,bj,4) = gsnm1(I,J,K,bi,bj)
       StoreDynVars3D(I,J,K,bi,bj,5) = gunm1(I,J,K,bi,bj)
       StoreDynVars3D(I,J,K,bi,bj,6) = gvnm1(I,J,K,bi,bj)
       StoreDynVars3D(I,J,K,bi,bj,7) = theta(I,J,K,bi,bj)             
       StoreDynVars3D(I,J,K,bi,bj,8) = salt(I,J,K,bi,bj)             
       StoreDynVars3D(I,J,K,bi,bj,9) = uvel(I,J,K,bi,bj)             
       StoreDynVars3D(I,J,K,bi,bj,10) = vvel(I,J,K,bi,bj)     
       StoreDynVars3D(I,J,K,bi,bj,11) = wvel(I,J,K,bi,bj)
       StoreDynVars3D(I,J,K,bi,bj,12) = totphihyd(I,J,K,bi,bj)
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDDO
   
      IF ( debugLevel .GE. debLevB ) 
     &    CALL DEBUG_LEAVE('AUTODIFF_STORE',myThid)
      return
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      subroutine autodiff_restore( mythid )
c
c
c
      implicit none
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      integer ilev_1
      integer ilev_2
      integer ilev_3
      integer ilev_4
      integer max_lev2
      integer max_lev3
      integer max_lev4
      integer NDV3D, NDV2D, NEXF1, NEXF2, NCTRL1, NOB, NSI
      PARAMETER (NDV3D  = 12)
      PARAMETER (NDV2D  = 23)
      PARAMETER (NEXF1  = 21)
      PARAMETER (NEXF2  = 18)
      PARAMETER (NCTRL1 = 18)
      PARAMETER (NOB = 18)
      PARAMETER (NSI = 19)
      Real*8 StoreDynVars3D
     &    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy,NDV3D)
      Real*8 StoreDynVars2D
     &    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy,NDV2D)
      Real*8 StoreEXF1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy,NEXF1)
      Real*8 StoreEXF2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy,NEXF2)
      Real*8 StoreCTRLS1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy,NCTRL1)
      Real*8 StoreOBCSN(1-Olx:sNx+Olx,Nr,nSx,nSy,NOB)
      Real*8 StoreOBCSS(1-Olx:sNx+Olx,Nr,nSx,nSy,NOB)
      Real*8 StoreOBCSE(1-OLy:sNy+OLy,Nr,nSx,nSy,NOB)
      Real*8 StoreOBCSW(1-OLy:sNy+OLy,Nr,nSx,nSy,NOB)
      Real*8 StoreSEAICE(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy,NSI)
      COMMON /AUTODIFF_STORE_DYN/
     &       StoreDynVars3D,
     &       StoreDynVars2D
      COMMON /AUTODIFF_STORE_EXF_FLUX/
     &       StoreEXF1
      COMMON /AUTODIFF_STORE_EXF_ATMOS/
     &       StoreEXF2
      COMMON /AUTODIFF_STORE_CTRL/
     &       StoreCTRLS1
      COMMON /AUTODIFF_STORE_OBCSN/
     &       StoreOBCSN
      COMMON /AUTODIFF_STORE_OBCSS/
     &       StoreOBCSS
      COMMON /AUTODIFF_STORE_OBCSE/
     &       StoreOBCSE
      COMMON /AUTODIFF_STORE_OBCSW/
     &       StoreOBCSW
      COMMON /AUTODIFF_STORE_SEAICE/
     &       StoreSEAICE
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
      integer mythid 
      integer bi,bj
      integer I,J,K
       
      IF ( debugLevel .GE. debLevB ) 
     &    CALL DEBUG_ENTER('AUTODIFF_RESTORE',myThid)
          
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO J=1-Oly,sNy+Oly
         DO I=1-Olx,sNx+Olx
          etan(I,J,bi,bj)               = StoreDynVars2D(I,J,bi,bj,1)
          surfaceforcingTice(I,J,bi,bj) = StoreDynVars2D(I,J,bi,bj,2)
          taux0(I,J,bi,bj) = StoreDynVars2D(I,J,bi,bj,3)
          taux1(I,J,bi,bj) = StoreDynVars2D(I,J,bi,bj,4)
          tauy0(I,J,bi,bj) = StoreDynVars2D(I,J,bi,bj,5)
          tauy1(I,J,bi,bj) = StoreDynVars2D(I,J,bi,bj,6)
          qnet0(I,J,bi,bj) = StoreDynVars2D(I,J,bi,bj,7)
          qnet1(I,J,bi,bj) = StoreDynVars2D(I,J,bi,bj,8)
          empmr0(I,J,bi,bj) = StoreDynVars2D(I,J,bi,bj,9)
          empmr1(I,J,bi,bj) = StoreDynVars2D(I,J,bi,bj,10)
          sst0(I,J,bi,bj) = StoreDynVars2D(I,J,bi,bj,11)
          sst1(I,J,bi,bj) = StoreDynVars2D(I,J,bi,bj,12)
          sss0(I,J,bi,bj) = StoreDynVars2D(I,J,bi,bj,13)
          sss1(I,J,bi,bj) = StoreDynVars2D(I,J,bi,bj,14)
          saltflux0(I,J,bi,bj) = StoreDynVars2D(I,J,bi,bj,15)
          saltflux1(I,J,bi,bj) = StoreDynVars2D(I,J,bi,bj,16)
          etaH(I,J,bi,bj)    = StoreDynVars2D(I,J,bi,bj,21)
          dEtaHdt(I,J,bi,bj) = StoreDynVars2D(I,J,bi,bj,22)
          PmEpR(I,J,bi,bj)   = StoreDynVars2D(I,J,bi,bj,23)
         ENDDO
        ENDDO
        DO K=1,Nr
         DO J=1-Oly,sNy+Oly
          DO I=1-Olx,sNx+Olx
       gs(I,J,K,bi,bj)       = StoreDynVars3D(I,J,K,bi,bj,1)
       gt(I,J,K,bi,bj)       = StoreDynVars3D(I,J,K,bi,bj,2)
       gtnm1(I,J,K,bi,bj)    = StoreDynVars3D(I,J,K,bi,bj,3)
       gsnm1(I,J,K,bi,bj)    = StoreDynVars3D(I,J,K,bi,bj,4)
       gunm1(I,J,K,bi,bj)    = StoreDynVars3D(I,J,K,bi,bj,5)
       gvnm1(I,J,K,bi,bj)    = StoreDynVars3D(I,J,K,bi,bj,6)
       theta(I,J,K,bi,bj)    = StoreDynVars3D(I,J,K,bi,bj,7)        
       salt(I,J,K,bi,bj)     = StoreDynVars3D(I,J,K,bi,bj,8)       
       uvel(I,J,K,bi,bj)     = StoreDynVars3D(I,J,K,bi,bj,9)    
       vvel(I,J,K,bi,bj)     = StoreDynVars3D(I,J,K,bi,bj,10)     
       wvel(I,J,K,bi,bj)     = StoreDynVars3D(I,J,K,bi,bj,11)
       totphihyd(I,J,K,bi,bj)= StoreDynVars3D(I,J,K,bi,bj,12)
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDDO
       
      IF ( debugLevel .GE. debLevB ) 
     &    CALL DEBUG_LEAVE('AUTODIFF_RESTORE',myThid)
      return
      end
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CD_CODE_SCHEME(
     I        bi,bj,k, dPhiHydX,dPhiHydY, guFld,gvFld,
     O        guCor,gvCor,
     I        myTime, myIter, myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_CD/
     &                   uVelD, vVelD,
     &                   etaNm1,
     &                   uNM1,  vNM1
      Real*8  uVelD (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVelD (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  etaNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uNM1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vNM1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 dPhiHydX(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 dPhiHydY(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8    guFld(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8    gvFld(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8    guCor(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8    gvCor(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8     myTime
      INTEGER myIter
      INTEGER myThid
      INTEGER i,j
      Real*8 pF(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vF(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 aF(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 ab15,ab05
      Real*8 phxFac, phyFac
      INTEGER iMin,iMax, jMin,jMax
      PARAMETER( iMin = 1-Olx+1 , iMax = sNx+Olx-1 )
      PARAMETER( jMin = 1-Oly+1 , jMax = sNy+Oly-1 )
      ab15   =  1.5d0 + epsAB_CD
      ab05   = -0.5d0 - epsAB_CD
      IF (staggerTimeStep) THEN
        phxFac = pfFacMom
        phyFac = pfFacMom
      ELSE
        phxFac = 0.
        phyFac = 0.
      ENDIF
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
        pf(i,j) = Bo_surf(i,j,bi,bj)
     &          *( ab15*etaN(i,j,bi,bj) + ab05*etaNm1(i,j,bi,bj) )
       ENDDO
      ENDDO
      DO j=1-Oly+1,sNy+Oly
       DO i=1-Olx,sNx+Olx
        af(i,j) =
     &        (  gvFld(i,j)
     &          -( recip_dyC(i,j,bi,bj)*(pf(i,j)-pf(i,j-1))
     &            +phyFac*dPhiHydY(i,j) )
     &        )*maskS(i,j,k,bi,bj)
       ENDDO
      ENDDO
      DO j=jMin,jMax
       DO i=iMin,iMax
        vf(i,j) =
     &           ( (af(i,j)+af(i-1,j+1))
     &            +(af(i-1,j)+af(i,j+1)) )*0.25d0
     &           *maskW(i,j,k,bi,bj)
     &          -( fCori( i, j,bi,bj)
     &            +fCori(i-1,j,bi,bj) )*0.5d0
     &           *( ab15*uVel(i,j,k,bi,bj) + ab05*uNM1(i,j,k,bi,bj) )
       ENDDO
      ENDDO
      DO j=jMin,jMax
       DO i=iMin,iMax
        vVelD(i,j,k,bi,bj) = vVelD(i,j,k,bi,bj) + deltaTmom*vf(i,j)
       ENDDO
      ENDDO
      DO j=jMin,jMax
       DO i=iMin,iMax
         vVelD(i,j,k,bi,bj) = ( rCD*vVelD(i,j,k,bi,bj)
     &                         +(1.d0 - rCD)
     &         *( ab15*(
     &                  (vVel(i,j,k,bi,bj)+vVel(i-1,j+1,k,bi,bj))
     &                 +(vVel(i-1,j,k,bi,bj)+vVel(i,j+1,k,bi,bj))
     &                 )*0.25d0
     &           +ab05*(
     &                  (vNM1(i,j,k,bi,bj)+vNM1(i-1,j+1,k,bi,bj))
     &                 +(vNM1(i-1,j,k,bi,bj)+vNM1(i,j+1,k,bi,bj))
     &                 )*0.25d0
     &          )             )*maskW(i,j,k,bi,bj)
       ENDDO
      ENDDO
      DO j=jMin,jMax
       DO i=iMin,iMax
        guCor(i,j) =
     &              ( fCori( i, j,bi,bj)
     &               +fCori(i-1,j,bi,bj) )*0.5d0
     &              *vVelD(i,j,k,bi,bj)*cfFacMom
       ENDDO
      ENDDO
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx+1,sNx+Olx
        af(i,j) =
     &        (  guFld(i,j)
     &          -( recip_dxC(i,j,bi,bj)*(pf(i,j)-pf(i-1,j))
     &            +phxFac*dPhiHydX(i,j) )
     &        )*maskW(i,j,k,bi,bj)
       ENDDO
      ENDDO
      DO j=jMin,jMax
       DO i=iMin,iMax
        vf(i,j) =
     &           ( (af(i,j)+af(i+1,j-1))
     &            +(af(i+1,j)+af(i,j-1)) )*0.25d0
     &           *maskS(i,j,k,bi,bj)
     &          +( fCori(i, j, bi,bj)
     &            +fCori(i,j-1,bi,bj) )*0.5d0
     &           *( ab15*vVel(i,j,k,bi,bj) + ab05*vNM1(i,j,k,bi,bj) )
       ENDDO
      ENDDO
      DO j=jMin,jMax
       DO i=iMin,iMax
        uVelD(i,j,k,bi,bj) = uVelD(i,j,k,bi,bj) + deltaTmom*vf(i,j)
       ENDDO
      ENDDO
      DO j=jMin,jMax
       DO i=iMin,iMax
         uVelD(i,j,k,bi,bj) = ( rCD*uVelD(i,j,k,bi,bj)
     &                         +(1.d0 - rCD)
     &         *( ab15*(
     &                  (uVel(i,j,k,bi,bj)+uVel(i+1,j-1,k,bi,bj))
     &                 +(uVel(i,j-1,k,bi,bj)+uVel(i+1,j,k,bi,bj))
     &                 )*0.25d0
     &           +ab05*(
     &                  (uNM1(i,j,k,bi,bj)+uNM1(i+1,j-1,k,bi,bj))
     &                 +(uNM1(i,j-1,k,bi,bj)+uNM1(i+1,j,k,bi,bj))
     &                 )*0.25d0
     &          )             )*maskS(i,j,k,bi,bj)
       ENDDO
      ENDDO
      DO j=jMin,jMax
       DO i=iMin,iMax
        gvCor(i,j) =
     &             -( fCori(i, j, bi,bj)
     &               +fCori(i,j-1,bi,bj) )*0.5d0
     &              *uVelD(i,j,k,bi,bj)*cfFacMom
       ENDDO
      ENDDO
      DO j=1-OLy,sNy+OLy
       DO i=1-OLx,sNx+OLx
         uNM1(i,j,k,bi,bj) = uVel(i,j,k,bi,bj)
         vNM1(i,j,k,bi,bj) = vVel(i,j,k,bi,bj)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CD_CODE_INI_VARS( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_CD/
     &                   uVelD, vVelD,
     &                   etaNm1,
     &                   uNM1,  vNM1
      Real*8  uVelD (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVelD (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  etaNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uNM1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vNM1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      INTEGER bi, bj
      INTEGER I, J, K
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO K=1,Nr
         DO J=1-Oly,sNy+Oly
          DO I=1-Olx,sNx+Olx
           uNM1(I,J,K,bi,bj)=0.d0
           vNM1(I,J,K,bi,bj)=0.d0
           uVeld(I,J,K,bi,bj)=0.d0
           vVeld(I,J,K,bi,bj)=0.d0
          ENDDO
         ENDDO
        ENDDO
        DO J=1-Oly,sNy+Oly
         DO I=1-Olx,sNx+Olx
          etaNm1(I,J,bi,bj)=0.d0
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      IF ( nIter0.NE.0 .OR. pickupSuff.NE.' ' ) THEN
        CALL CD_CODE_READ_PICKUP( nIter0, myThid )
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      subroutine cost_accumulate_mean( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
      common /cost_r/
     &                fc
      Real*8  fc
      common /cost_objf/
     &                objf_atl,
     &                objf_test,
     &                objf_tracer,
     &                objf_entropy,
     &                objf_t_misfit,
     &                objf_eflux
cHFLUXM_CONTROL
     &               ,objf_hflux_tut
     &               ,objf_temp_tut
cHFLUXM_CONTROL
      Real*8  objf_atl  (nsx,nsy)
      Real*8  objf_test (nsx,nsy)
      Real*8  objf_tracer (nsx,nsy)
      Real*8  objf_entropy (nsx,nsy)
      Real*8  objf_t_misfit (nsx,nsy)
      Real*8  objf_eflux (nsx,nsy)
cHFLUXM_CONTROL
      Real*8  objf_hflux_tut (nsx,nsy)
      Real*8  objf_temp_tut (nsx,nsy)
cHFLUXM_CONTROL
      common /cost_param_r/
     &                lastinterval
      Real*8 lastinterval
      common /cost_aux_r/
     &                    mult_atl,
     &                    mult_test,
     &                    mult_tracer,
     &                    mult_entropy,
     &                    mult_t_misfit,
     &                    mult_eflux,
     &                    multTheta,
     &                    multSalt,
     &                    multUvel,
     &                    multVvel,
     &                    multEtan
cHFLUXM_CONTROL
     &                   ,mult_hflux_tut
     &                   ,mult_temp_tut
cHFLUXM_CONTROL
      Real*8  mult_atl
      Real*8  mult_test
      Real*8  mult_tracer
      Real*8  mult_entropy
      Real*8  mult_t_misfit
      Real*8  mult_eflux
      Real*8  multTheta
      Real*8  multSalt
      Real*8  multUvel
      Real*8  multVvel
      Real*8  multEtan
cHFLUXM_CONTROL
      Real*8  mult_hflux_tut
      Real*8  mult_temp_tut
cHFLUXM_CONTROL
      COMMON /COST_MEAN_R/
     &                     cMeanTheta, cMeanUVel, cMeanVVel,
     &                     cMeanThetaUVel, cMeanThetaVVel
      Real*8 cMeanTheta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      integer bi, bj
      integer myThid
      Real*8 thetaRef
      integer i, j, k
      integer ig, jg
      integer itlo,ithi
      integer jtlo,jthi
      jtlo = mybylo(mythid)
      jthi = mybyhi(mythid)
      itlo = mybxlo(mythid)
      ithi = mybxhi(mythid)
      do bj = jtlo,jthi
        do bi = itlo,ithi
          do k = 1, Nr
            do j=1,sNy
              do i=1,sNx
                cMeanTheta(i,j,k,bi,bj) = cMeanTheta(i,j,k,bi,bj)
     &                + theta(i,j,k,bi,bj)
     &                /lastinterval*deltaTClock
                cMeanUVel(i,j,k,bi,bj) = cMeanUVel(i,j,k,bi,bj)
     &               + uVel(i,j,k,bi,bj)
     &               /lastinterval*deltaTClock
                cMeanVVel(i,j,k,bi,bj) = cMeanVVel(i,j,k,bi,bj)
     &               + vVel(i,j,k,bi,bj)
     &               /lastinterval*deltaTClock
                cMeanThetaUVel(i,j,k,bi,bj) = 
     &               cMeanThetaUVel(i,j,k,bi,bj)
     &               + (theta(i,j,k,bi,bj)+theta(i-1,j,k,bi,bj))
     &                 /2.*uvel(i,j,k,bi,bj)
     &                 *maskW(i,j,k,bi,bj)*maskC(i,j,k,bi,bj)
     &                 /lastinterval*deltaTClock
                cMeanThetaVVel(i,j,k,bi,bj) = 
     &               cMeanThetaVVel(i,j,k,bi,bj)
     &               + (theta(i,j,k,bi,bj)+theta(i,j-1,k,bi,bj))
     &                 /2.*vvel(i,j,k,bi,bj)
     &                 *maskS(i,j,k,bi,bj)*maskC(i,j,k,bi,bj)
     &                 /lastinterval*deltaTClock
              end do
            end do
          end do
        end do
      end do
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine cost_final( mythid )
c
c
c
      implicit none
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
c
c
c
c
c
      common /cost_r/
     &                fc
      Real*8  fc
      common /cost_objf/
     &                objf_atl,
     &                objf_test,
     &                objf_tracer,
     &                objf_entropy,
     &                objf_t_misfit,
     &                objf_eflux
cHFLUXM_CONTROL
     &               ,objf_hflux_tut
     &               ,objf_temp_tut
cHFLUXM_CONTROL
      Real*8  objf_atl  (nsx,nsy)
      Real*8  objf_test (nsx,nsy)
      Real*8  objf_tracer (nsx,nsy)
      Real*8  objf_entropy (nsx,nsy)
      Real*8  objf_t_misfit (nsx,nsy)
      Real*8  objf_eflux (nsx,nsy)
cHFLUXM_CONTROL
      Real*8  objf_hflux_tut (nsx,nsy)
      Real*8  objf_temp_tut (nsx,nsy)
cHFLUXM_CONTROL
      common /cost_param_r/
     &                lastinterval
      Real*8 lastinterval
      common /cost_aux_r/
     &                    mult_atl,
     &                    mult_test,
     &                    mult_tracer,
     &                    mult_entropy,
     &                    mult_t_misfit,
     &                    mult_eflux,
     &                    multTheta,
     &                    multSalt,
     &                    multUvel,
     &                    multVvel,
     &                    multEtan
cHFLUXM_CONTROL
     &                   ,mult_hflux_tut
     &                   ,mult_temp_tut
cHFLUXM_CONTROL
      Real*8  mult_atl
      Real*8  mult_test
      Real*8  mult_tracer
      Real*8  mult_entropy
      Real*8  mult_t_misfit
      Real*8  mult_eflux
      Real*8  multTheta
      Real*8  multSalt
      Real*8  multUvel
      Real*8  multVvel
      Real*8  multEtan
cHFLUXM_CONTROL
      Real*8  mult_hflux_tut
      Real*8  mult_temp_tut
cHFLUXM_CONTROL
      COMMON /COST_MEAN_R/
     &                     cMeanTheta, cMeanUVel, cMeanVVel,
     &                     cMeanThetaUVel, cMeanThetaVVel
      Real*8 cMeanTheta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
      integer mythid
      integer i,j,k
      integer bi,bj
      integer itlo,ithi
      integer jtlo,jthi
      jtlo = mybylo(mythid)
      jthi = mybyhi(mythid)
      itlo = mybxlo(mythid)
      ithi = mybxhi(mythid)
      CALL COST_HFLUX (myThid)
      CALL COST_TEMP (myThid)
      do bj = jtlo,jthi
        do bi = itlo,ithi
          write(standardmessageunit,'(A,D22.15)')
     &          ' --> objf_test(bi,bj)   = ', objf_test(bi,bj)
          write(standardmessageunit,'(A,D22.15)')
     &         ' --> objf_tracer(bi,bj) = ', objf_tracer(bi,bj)
          write(standardmessageunit,'(A,D22.15)')
     &         ' --> objf_atl(bi,bj)    = ', objf_atl(bi,bj)
          write(standardmessageunit,'(A,D22.15)')
     &          ' --> objf_temp_tut(bi,bj)   = ', objf_temp_tut(bi,bj)
          write(standardmessageunit,'(A,D22.15)')
     &         ' --> objf_hflux_tut(bi,bj) = ', objf_hflux_tut(bi,bj)
          fc = fc
     &            + mult_test   * objf_test(bi,bj)
     &            + mult_tracer * objf_tracer(bi,bj)
     &            + mult_atl    * objf_atl(bi,bj)
     &            + mult_temp_tut  * objf_temp_tut(bi,bj)
     &            + mult_hflux_tut * objf_hflux_tut(bi,bj)
        enddo
      enddo
      write(standardmessageunit,'(A,D22.15)') '  local fc = ', fc
      CALL GLOBAL_SUM_R8 (  fc ,  myThid  )
      write(standardmessageunit,'(A,D22.15)') ' global fc = ', fc
      CALL TURNOFF_MODEL_IO( 0, myThid )
      return
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine cost_init_varia( mythid )
c
c
c
c
c
      implicit none
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
c
c
c
c
c
      common /cost_r/
     &                fc
      Real*8  fc
      common /cost_objf/
     &                objf_atl,
     &                objf_test,
     &                objf_tracer,
     &                objf_entropy,
     &                objf_t_misfit,
     &                objf_eflux
cHFLUXM_CONTROL
     &               ,objf_hflux_tut
     &               ,objf_temp_tut
cHFLUXM_CONTROL
      Real*8  objf_atl  (nsx,nsy)
      Real*8  objf_test (nsx,nsy)
      Real*8  objf_tracer (nsx,nsy)
      Real*8  objf_entropy (nsx,nsy)
      Real*8  objf_t_misfit (nsx,nsy)
      Real*8  objf_eflux (nsx,nsy)
cHFLUXM_CONTROL
      Real*8  objf_hflux_tut (nsx,nsy)
      Real*8  objf_temp_tut (nsx,nsy)
cHFLUXM_CONTROL
      common /cost_param_r/
     &                lastinterval
      Real*8 lastinterval
      common /cost_aux_r/
     &                    mult_atl,
     &                    mult_test,
     &                    mult_tracer,
     &                    mult_entropy,
     &                    mult_t_misfit,
     &                    mult_eflux,
     &                    multTheta,
     &                    multSalt,
     &                    multUvel,
     &                    multVvel,
     &                    multEtan
cHFLUXM_CONTROL
     &                   ,mult_hflux_tut
     &                   ,mult_temp_tut
cHFLUXM_CONTROL
      Real*8  mult_atl
      Real*8  mult_test
      Real*8  mult_tracer
      Real*8  mult_entropy
      Real*8  mult_t_misfit
      Real*8  mult_eflux
      Real*8  multTheta
      Real*8  multSalt
      Real*8  multUvel
      Real*8  multVvel
      Real*8  multEtan
cHFLUXM_CONTROL
      Real*8  mult_hflux_tut
      Real*8  mult_temp_tut
cHFLUXM_CONTROL
      COMMON /COST_MEAN_R/
     &                     cMeanTheta, cMeanUVel, cMeanVVel,
     &                     cMeanThetaUVel, cMeanThetaVVel
      Real*8 cMeanTheta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      integer mythid
      integer i,j,k
      integer bi,bj
      integer itlo,ithi
      integer jtlo,jthi
      jtlo = mybylo(mythid)
      jthi = mybyhi(mythid)
      itlo = mybxlo(mythid)
      ithi = mybxhi(mythid)
      do bj = jtlo,jthi
        do bi = itlo,ithi
          objf_atl(bi,bj)  = 0.d0
          objf_test(bi,bj) = 0.d0
          objf_tracer(bi,bj) = 0.d0
c
          do k=1,nr
            do j=1,sNy
              do i=1,sNx
                cMeanTheta(i,j,k,bi,bj) = 0.d0
                cMeanUVel(i,j,k,bi,bj)  = 0.d0
                cMeanVVel(i,j,k,bi,bj)  = 0.d0
                cMeanThetaUVel(i,j,k,bi,bj) = 0.d0
                cMeanThetaVVel(i,j,k,bi,bj) = 0.d0
              end do
            end do
          end do
c
       enddo
      enddo
      IF (  mythid  .EQ. 1 ) THEN
        fc         = 0.d0
      ENDIF
      CALL BARRIER(myThid)
      return
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
CBOI
C
c
CEOI
      subroutine cost_tile( mytime, myiter, myThid )
      implicit none
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
      common /cost_r/
     &                fc
      Real*8  fc
      common /cost_objf/
     &                objf_atl,
     &                objf_test,
     &                objf_tracer,
     &                objf_entropy,
     &                objf_t_misfit,
     &                objf_eflux
cHFLUXM_CONTROL
     &               ,objf_hflux_tut
     &               ,objf_temp_tut
cHFLUXM_CONTROL
      Real*8  objf_atl  (nsx,nsy)
      Real*8  objf_test (nsx,nsy)
      Real*8  objf_tracer (nsx,nsy)
      Real*8  objf_entropy (nsx,nsy)
      Real*8  objf_t_misfit (nsx,nsy)
      Real*8  objf_eflux (nsx,nsy)
cHFLUXM_CONTROL
      Real*8  objf_hflux_tut (nsx,nsy)
      Real*8  objf_temp_tut (nsx,nsy)
cHFLUXM_CONTROL
      common /cost_param_r/
     &                lastinterval
      Real*8 lastinterval
      common /cost_aux_r/
     &                    mult_atl,
     &                    mult_test,
     &                    mult_tracer,
     &                    mult_entropy,
     &                    mult_t_misfit,
     &                    mult_eflux,
     &                    multTheta,
     &                    multSalt,
     &                    multUvel,
     &                    multVvel,
     &                    multEtan
cHFLUXM_CONTROL
     &                   ,mult_hflux_tut
     &                   ,mult_temp_tut
cHFLUXM_CONTROL
      Real*8  mult_atl
      Real*8  mult_test
      Real*8  mult_tracer
      Real*8  mult_entropy
      Real*8  mult_t_misfit
      Real*8  mult_eflux
      Real*8  multTheta
      Real*8  multSalt
      Real*8  multUvel
      Real*8  multVvel
      Real*8  multEtan
cHFLUXM_CONTROL
      Real*8  mult_hflux_tut
      Real*8  mult_temp_tut
cHFLUXM_CONTROL
      COMMON /COST_MEAN_R/
     &                     cMeanTheta, cMeanUVel, cMeanVVel,
     &                     cMeanThetaUVel, cMeanThetaVVel
      Real*8 cMeanTheta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
      Real*8 myTime
      integer myiter
      integer myThid
      integer bi, bj
CADJ STORE theta         = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE uvel, vvel    = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
      IF ( myTime .GT. (EndTime - lastinterval) ) THEN
         CALL COST_ACCUMULATE_MEAN (myThid)
      ENDIF
      DO bj=myByLo(myThid),myByHi(myThid)
        DO bi=myBxLo(myThid),myBxHi(myThid)
        ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      subroutine cost_test( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
      common /cost_r/
     &                fc
      Real*8  fc
      common /cost_objf/
     &                objf_atl,
     &                objf_test,
     &                objf_tracer,
     &                objf_entropy,
     &                objf_t_misfit,
     &                objf_eflux
cHFLUXM_CONTROL
     &               ,objf_hflux_tut
     &               ,objf_temp_tut
cHFLUXM_CONTROL
      Real*8  objf_atl  (nsx,nsy)
      Real*8  objf_test (nsx,nsy)
      Real*8  objf_tracer (nsx,nsy)
      Real*8  objf_entropy (nsx,nsy)
      Real*8  objf_t_misfit (nsx,nsy)
      Real*8  objf_eflux (nsx,nsy)
cHFLUXM_CONTROL
      Real*8  objf_hflux_tut (nsx,nsy)
      Real*8  objf_temp_tut (nsx,nsy)
cHFLUXM_CONTROL
      common /cost_param_r/
     &                lastinterval
      Real*8 lastinterval
      common /cost_aux_r/
     &                    mult_atl,
     &                    mult_test,
     &                    mult_tracer,
     &                    mult_entropy,
     &                    mult_t_misfit,
     &                    mult_eflux,
     &                    multTheta,
     &                    multSalt,
     &                    multUvel,
     &                    multVvel,
     &                    multEtan
cHFLUXM_CONTROL
     &                   ,mult_hflux_tut
     &                   ,mult_temp_tut
cHFLUXM_CONTROL
      Real*8  mult_atl
      Real*8  mult_test
      Real*8  mult_tracer
      Real*8  mult_entropy
      Real*8  mult_t_misfit
      Real*8  mult_eflux
      Real*8  multTheta
      Real*8  multSalt
      Real*8  multUvel
      Real*8  multVvel
      Real*8  multEtan
cHFLUXM_CONTROL
      Real*8  mult_hflux_tut
      Real*8  mult_temp_tut
cHFLUXM_CONTROL
      COMMON /COST_MEAN_R/
     &                     cMeanTheta, cMeanUVel, cMeanVVel,
     &                     cMeanThetaUVel, cMeanThetaVVel
      Real*8 cMeanTheta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      integer bi, bj
      integer myThid
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine cost_tracer( bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
      common /cost_r/
     &                fc
      Real*8  fc
      common /cost_objf/
     &                objf_atl,
     &                objf_test,
     &                objf_tracer,
     &                objf_entropy,
     &                objf_t_misfit,
     &                objf_eflux
cHFLUXM_CONTROL
     &               ,objf_hflux_tut
     &               ,objf_temp_tut
cHFLUXM_CONTROL
      Real*8  objf_atl  (nsx,nsy)
      Real*8  objf_test (nsx,nsy)
      Real*8  objf_tracer (nsx,nsy)
      Real*8  objf_entropy (nsx,nsy)
      Real*8  objf_t_misfit (nsx,nsy)
      Real*8  objf_eflux (nsx,nsy)
cHFLUXM_CONTROL
      Real*8  objf_hflux_tut (nsx,nsy)
      Real*8  objf_temp_tut (nsx,nsy)
cHFLUXM_CONTROL
      common /cost_param_r/
     &                lastinterval
      Real*8 lastinterval
      common /cost_aux_r/
     &                    mult_atl,
     &                    mult_test,
     &                    mult_tracer,
     &                    mult_entropy,
     &                    mult_t_misfit,
     &                    mult_eflux,
     &                    multTheta,
     &                    multSalt,
     &                    multUvel,
     &                    multVvel,
     &                    multEtan
cHFLUXM_CONTROL
     &                   ,mult_hflux_tut
     &                   ,mult_temp_tut
cHFLUXM_CONTROL
      Real*8  mult_atl
      Real*8  mult_test
      Real*8  mult_tracer
      Real*8  mult_entropy
      Real*8  mult_t_misfit
      Real*8  mult_eflux
      Real*8  multTheta
      Real*8  multSalt
      Real*8  multUvel
      Real*8  multVvel
      Real*8  multEtan
cHFLUXM_CONTROL
      Real*8  mult_hflux_tut
      Real*8  mult_temp_tut
cHFLUXM_CONTROL
      COMMON /COST_MEAN_R/
     &                     cMeanTheta, cMeanUVel, cMeanVVel,
     &                     cMeanThetaUVel, cMeanThetaVVel
      Real*8 cMeanTheta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      integer bi, bj
      integer myThid
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine cost_atlantic_heat( myThid )
       implicit none
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
c
c
c
c
c
      common /cost_r/
     &                fc
      Real*8  fc
      common /cost_objf/
     &                objf_atl,
     &                objf_test,
     &                objf_tracer,
     &                objf_entropy,
     &                objf_t_misfit,
     &                objf_eflux
cHFLUXM_CONTROL
     &               ,objf_hflux_tut
     &               ,objf_temp_tut
cHFLUXM_CONTROL
      Real*8  objf_atl  (nsx,nsy)
      Real*8  objf_test (nsx,nsy)
      Real*8  objf_tracer (nsx,nsy)
      Real*8  objf_entropy (nsx,nsy)
      Real*8  objf_t_misfit (nsx,nsy)
      Real*8  objf_eflux (nsx,nsy)
cHFLUXM_CONTROL
      Real*8  objf_hflux_tut (nsx,nsy)
      Real*8  objf_temp_tut (nsx,nsy)
cHFLUXM_CONTROL
      common /cost_param_r/
     &                lastinterval
      Real*8 lastinterval
      common /cost_aux_r/
     &                    mult_atl,
     &                    mult_test,
     &                    mult_tracer,
     &                    mult_entropy,
     &                    mult_t_misfit,
     &                    mult_eflux,
     &                    multTheta,
     &                    multSalt,
     &                    multUvel,
     &                    multVvel,
     &                    multEtan
cHFLUXM_CONTROL
     &                   ,mult_hflux_tut
     &                   ,mult_temp_tut
cHFLUXM_CONTROL
      Real*8  mult_atl
      Real*8  mult_test
      Real*8  mult_tracer
      Real*8  mult_entropy
      Real*8  mult_t_misfit
      Real*8  mult_eflux
      Real*8  multTheta
      Real*8  multSalt
      Real*8  multUvel
      Real*8  multVvel
      Real*8  multEtan
cHFLUXM_CONTROL
      Real*8  mult_hflux_tut
      Real*8  mult_temp_tut
cHFLUXM_CONTROL
      COMMON /COST_MEAN_R/
     &                     cMeanTheta, cMeanUVel, cMeanVVel,
     &                     cMeanThetaUVel, cMeanThetaVVel
      Real*8 cMeanTheta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      integer myThid
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine cost_vector( myThid )
       implicit none
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
c
c
c
c
c
      common /cost_r/
     &                fc
      Real*8  fc
      common /cost_objf/
     &                objf_atl,
     &                objf_test,
     &                objf_tracer,
     &                objf_entropy,
     &                objf_t_misfit,
     &                objf_eflux
cHFLUXM_CONTROL
     &               ,objf_hflux_tut
     &               ,objf_temp_tut
cHFLUXM_CONTROL
      Real*8  objf_atl  (nsx,nsy)
      Real*8  objf_test (nsx,nsy)
      Real*8  objf_tracer (nsx,nsy)
      Real*8  objf_entropy (nsx,nsy)
      Real*8  objf_t_misfit (nsx,nsy)
      Real*8  objf_eflux (nsx,nsy)
cHFLUXM_CONTROL
      Real*8  objf_hflux_tut (nsx,nsy)
      Real*8  objf_temp_tut (nsx,nsy)
cHFLUXM_CONTROL
      common /cost_param_r/
     &                lastinterval
      Real*8 lastinterval
      common /cost_aux_r/
     &                    mult_atl,
     &                    mult_test,
     &                    mult_tracer,
     &                    mult_entropy,
     &                    mult_t_misfit,
     &                    mult_eflux,
     &                    multTheta,
     &                    multSalt,
     &                    multUvel,
     &                    multVvel,
     &                    multEtan
cHFLUXM_CONTROL
     &                   ,mult_hflux_tut
     &                   ,mult_temp_tut
cHFLUXM_CONTROL
      Real*8  mult_atl
      Real*8  mult_test
      Real*8  mult_tracer
      Real*8  mult_entropy
      Real*8  mult_t_misfit
      Real*8  mult_eflux
      Real*8  multTheta
      Real*8  multSalt
      Real*8  multUvel
      Real*8  multVvel
      Real*8  multEtan
cHFLUXM_CONTROL
      Real*8  mult_hflux_tut
      Real*8  mult_temp_tut
cHFLUXM_CONTROL
      COMMON /COST_MEAN_R/
     &                     cMeanTheta, cMeanUVel, cMeanVVel,
     &                     cMeanThetaUVel, cMeanThetaVVel
      Real*8 cMeanTheta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      integer myThid
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine cost_state_final( myThid )
       implicit none
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
c
c
c
c
c
      common /cost_r/
     &                fc
      Real*8  fc
      common /cost_objf/
     &                objf_atl,
     &                objf_test,
     &                objf_tracer,
     &                objf_entropy,
     &                objf_t_misfit,
     &                objf_eflux
cHFLUXM_CONTROL
     &               ,objf_hflux_tut
     &               ,objf_temp_tut
cHFLUXM_CONTROL
      Real*8  objf_atl  (nsx,nsy)
      Real*8  objf_test (nsx,nsy)
      Real*8  objf_tracer (nsx,nsy)
      Real*8  objf_entropy (nsx,nsy)
      Real*8  objf_t_misfit (nsx,nsy)
      Real*8  objf_eflux (nsx,nsy)
cHFLUXM_CONTROL
      Real*8  objf_hflux_tut (nsx,nsy)
      Real*8  objf_temp_tut (nsx,nsy)
cHFLUXM_CONTROL
      common /cost_param_r/
     &                lastinterval
      Real*8 lastinterval
      common /cost_aux_r/
     &                    mult_atl,
     &                    mult_test,
     &                    mult_tracer,
     &                    mult_entropy,
     &                    mult_t_misfit,
     &                    mult_eflux,
     &                    multTheta,
     &                    multSalt,
     &                    multUvel,
     &                    multVvel,
     &                    multEtan
cHFLUXM_CONTROL
     &                   ,mult_hflux_tut
     &                   ,mult_temp_tut
cHFLUXM_CONTROL
      Real*8  mult_atl
      Real*8  mult_test
      Real*8  mult_tracer
      Real*8  mult_entropy
      Real*8  mult_t_misfit
      Real*8  mult_eflux
      Real*8  multTheta
      Real*8  multSalt
      Real*8  multUvel
      Real*8  multVvel
      Real*8  multEtan
cHFLUXM_CONTROL
      Real*8  mult_hflux_tut
      Real*8  mult_temp_tut
cHFLUXM_CONTROL
      COMMON /COST_MEAN_R/
     &                     cMeanTheta, cMeanUVel, cMeanVVel,
     &                     cMeanThetaUVel, cMeanThetaVVel
      Real*8 cMeanTheta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      integer myThid
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine ctrl_depth_ini( mythid )
      implicit none
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
c
c
      common /ctrl_dummy/
     &                    xx_theta_dummy
     &                  , xx_salt_dummy
     &                  , xx_hflux_dummy
     &                  , xx_sflux_dummy
     &                  , xx_tauu_dummy
     &                  , xx_tauv_dummy
     &                  , xx_atemp_dummy
     &                  , xx_aqh_dummy
     &                  , xx_precip_dummy
     &                  , xx_swflux_dummy
     &                  , xx_swdown_dummy
     &                  , xx_snowprecip_dummy
     &                  , xx_lwflux_dummy
     &                  , xx_lwdown_dummy
     &                  , xx_evap_dummy
     &                  , xx_apressure_dummy
     &                  , xx_runoff_dummy
     &                  , xx_uwind_dummy
     &                  , xx_vwind_dummy
     &                  , xx_obcsn_dummy
     &                  , xx_obcss_dummy
     &                  , xx_obcsw_dummy
     &                  , xx_obcse_dummy
     &                  , xx_diffkr_dummy
     &                  , xx_kapgm_dummy
     &                  , xx_kapredi_dummy
     &                  , xx_tr1_dummy
     &                  , xx_sst_dummy
     &                  , xx_sss_dummy
     &                  , xx_depth_dummy
     &                  , xx_efluxy_dummy
     &                  , xx_efluxp_dummy
     &                  , xx_bottomdrag_dummy
     &                  , xx_edtaux_dummy
     &                  , xx_edtauy_dummy
     &                  , xx_uvel_dummy
     &                  , xx_vvel_dummy
     &                  , xx_etan_dummy
     &                  , xx_siarea_dummy
     &                  , xx_siheff_dummy
     &                  , xx_sihsnow_dummy
     &                  , xx_relaxsst_dummy
     &                  , xx_relaxsss_dummy
     &                  , xx_tbar_mean_dummy
     &                  , xx_tbar_daily_mean_dummy
     &                  , xx_sbar_mean_dummy
     &                  , xx_sbar_daily_mean_dummy
     &                  , xx_ubar_mean_dummy
     &                  , xx_vbar_mean_dummy
     &                  , xx_wbar_mean_dummy
     &                  , xx_psbar_mean_dummy
     &                  , xx_bpbar_mean_dummy
     &                  , xx_taux_mean_dummy
     &                  , xx_tauy_mean_dummy
     &                  , xx_hflux_mean_dummy
     &                  , xx_sflux_mean_dummy
     &                  , xx_sstbar_mean_dummy
     &                  , xx_sssbar_mean_dummy
     &                  , xx_atemp_mean_dummy
     &                  , xx_aqh_mean_dummy
     &                  , xx_precip_mean_dummy
     &                  , xx_swflux_mean_dummy
     &                  , xx_swdown_mean_dummy
     &                  , xx_snowprecip_mean_dummy
     &                  , xx_lwflux_mean_dummy
     &                  , xx_lwdown_mean_dummy
     &                  , xx_evap_mean_dummy
     &                  , xx_apressure_mean_dummy
     &                  , xx_runoff_mean_dummy
     &                  , xx_uwind_mean_dummy
     &                  , xx_vwind_mean_dummy
     &                  , xx_theta_ini_fin_dummy
     &                  , xx_salt_ini_fin_dummy
     &                  , xx_smrareabar_mean_dummy
     &                  , xx_smrsstbar_mean_dummy
     &                  , xx_smrsssbar_mean_dummy
     &                  , xx_gen2d_dummy
     &                  , xx_gen3d_dummy
cHFLUXM_CONTROL
     &                  , xx_hfluxm_dummy
cHFLUXM_CONTROL
      Real*8 xx_theta_dummy
      Real*8 xx_salt_dummy
      Real*8 xx_hflux_dummy
      Real*8 xx_sflux_dummy
      Real*8 xx_tauu_dummy
      Real*8 xx_tauv_dummy
      Real*8 xx_atemp_dummy
      Real*8 xx_aqh_dummy
      Real*8 xx_precip_dummy
      Real*8 xx_swflux_dummy
      Real*8 xx_swdown_dummy
      Real*8 xx_snowprecip_dummy
      Real*8 xx_lwflux_dummy
      Real*8 xx_lwdown_dummy
      Real*8 xx_evap_dummy
      Real*8 xx_apressure_dummy
      Real*8 xx_runoff_dummy
      Real*8 xx_uwind_dummy
      Real*8 xx_vwind_dummy
      Real*8 xx_obcsn_dummy
      Real*8 xx_obcss_dummy
      Real*8 xx_obcsw_dummy
      Real*8 xx_obcse_dummy
      Real*8 xx_diffkr_dummy
      Real*8 xx_kapgm_dummy
      Real*8 xx_kapredi_dummy
      Real*8 xx_tr1_dummy
      Real*8 xx_sst_dummy
      Real*8 xx_sss_dummy
      Real*8 xx_depth_dummy
      Real*8 xx_efluxy_dummy
      Real*8 xx_efluxp_dummy
      Real*8 xx_bottomdrag_dummy
      Real*8 xx_edtaux_dummy
      Real*8 xx_edtauy_dummy
      Real*8 xx_uvel_dummy
      Real*8 xx_vvel_dummy
      Real*8 xx_etan_dummy
      Real*8 xx_siarea_dummy
      Real*8 xx_siheff_dummy
      Real*8 xx_sihsnow_dummy
      Real*8 xx_relaxsst_dummy
      Real*8 xx_relaxsss_dummy
      Real*8 xx_gen2d_dummy
      Real*8 xx_gen3d_dummy
c
      Real*8 xx_tbar_mean_dummy
      Real*8 xx_tbar_daily_mean_dummy
      Real*8 xx_sbar_mean_dummy
      Real*8 xx_sbar_daily_mean_dummy
      Real*8 xx_ubar_mean_dummy
      Real*8 xx_vbar_mean_dummy
      Real*8 xx_wbar_mean_dummy
      Real*8 xx_psbar_mean_dummy
      Real*8 xx_bpbar_mean_dummy
      Real*8 xx_hflux_mean_dummy
      Real*8 xx_sflux_mean_dummy
      Real*8 xx_sstbar_mean_dummy
      Real*8 xx_sssbar_mean_dummy
      Real*8 xx_taux_mean_dummy
      Real*8 xx_tauy_mean_dummy
      Real*8 xx_atemp_mean_dummy
      Real*8 xx_aqh_mean_dummy
      Real*8 xx_precip_mean_dummy
      Real*8 xx_swflux_mean_dummy
      Real*8 xx_swdown_mean_dummy
      Real*8 xx_snowprecip_mean_dummy
      Real*8 xx_lwflux_mean_dummy
      Real*8 xx_lwdown_mean_dummy
      Real*8 xx_evap_mean_dummy
      Real*8 xx_apressure_mean_dummy
      Real*8 xx_runoff_mean_dummy
      Real*8 xx_uwind_mean_dummy
      Real*8 xx_vwind_mean_dummy
      Real*8 xx_theta_ini_fin_dummy
      Real*8 xx_salt_ini_fin_dummy
      Real*8 xx_smrareabar_mean_dummy
      Real*8 xx_smrsstbar_mean_dummy
      Real*8 xx_smrsssbar_mean_dummy
cHFLUXM_CONTROL
      Real*8 xx_hfluxm_dummy
cHFLUXM_CONTROL
c
c
c
c
c
c
c
c
c
      character*(5)  lsoptversion
      parameter    ( lsoptversion = '2.1.0' )
      character*(5)  offlineversion
      parameter    ( offlineversion = '0.1.1' )
c
c
      common /optiparm_i/
     &                    optimcycle,
     &                    nvars,
     &                    numiter,
     &                    nfunc,
     &                    iprint,
     &                    nupdate
      integer optimcycle
      integer nvars
      integer numiter
      integer nfunc
      integer iprint
      integer nupdate
      common /optiparm_r/
     &                    fmin,
     &                    epsf,
     &                    epsx,
     &                    epsg,
     &                    eps
      Real*8 epsf
      Real*8 epsx
      Real*8 fmin
      Real*8 epsg
      Real*8 eps
      common /optiparm_l/
     &                    nondimcontrol
      logical nondimcontrol
      common /optiparm_c/
     &                    copt
      character*( 3) copt
      integer mythid
      return
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine ctrl_get_gen(
     I          xx_gen_file, xx_genstartdate, xx_genperiod,
     I          genmask, genfld, xx_gen0, xx_gen1, xx_gen_dummy,
     I          xx_gen_remo_intercept, xx_gen_remo_slope,
     I          mytime, myiter, mythid
     &                     )
c
c
      implicit none
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
c
c
      common /ctrl_dummy/
     &                    xx_theta_dummy
     &                  , xx_salt_dummy
     &                  , xx_hflux_dummy
     &                  , xx_sflux_dummy
     &                  , xx_tauu_dummy
     &                  , xx_tauv_dummy
     &                  , xx_atemp_dummy
     &                  , xx_aqh_dummy
     &                  , xx_precip_dummy
     &                  , xx_swflux_dummy
     &                  , xx_swdown_dummy
     &                  , xx_snowprecip_dummy
     &                  , xx_lwflux_dummy
     &                  , xx_lwdown_dummy
     &                  , xx_evap_dummy
     &                  , xx_apressure_dummy
     &                  , xx_runoff_dummy
     &                  , xx_uwind_dummy
     &                  , xx_vwind_dummy
     &                  , xx_obcsn_dummy
     &                  , xx_obcss_dummy
     &                  , xx_obcsw_dummy
     &                  , xx_obcse_dummy
     &                  , xx_diffkr_dummy
     &                  , xx_kapgm_dummy
     &                  , xx_kapredi_dummy
     &                  , xx_tr1_dummy
     &                  , xx_sst_dummy
     &                  , xx_sss_dummy
     &                  , xx_depth_dummy
     &                  , xx_efluxy_dummy
     &                  , xx_efluxp_dummy
     &                  , xx_bottomdrag_dummy
     &                  , xx_edtaux_dummy
     &                  , xx_edtauy_dummy
     &                  , xx_uvel_dummy
     &                  , xx_vvel_dummy
     &                  , xx_etan_dummy
     &                  , xx_siarea_dummy
     &                  , xx_siheff_dummy
     &                  , xx_sihsnow_dummy
     &                  , xx_relaxsst_dummy
     &                  , xx_relaxsss_dummy
     &                  , xx_tbar_mean_dummy
     &                  , xx_tbar_daily_mean_dummy
     &                  , xx_sbar_mean_dummy
     &                  , xx_sbar_daily_mean_dummy
     &                  , xx_ubar_mean_dummy
     &                  , xx_vbar_mean_dummy
     &                  , xx_wbar_mean_dummy
     &                  , xx_psbar_mean_dummy
     &                  , xx_bpbar_mean_dummy
     &                  , xx_taux_mean_dummy
     &                  , xx_tauy_mean_dummy
     &                  , xx_hflux_mean_dummy
     &                  , xx_sflux_mean_dummy
     &                  , xx_sstbar_mean_dummy
     &                  , xx_sssbar_mean_dummy
     &                  , xx_atemp_mean_dummy
     &                  , xx_aqh_mean_dummy
     &                  , xx_precip_mean_dummy
     &                  , xx_swflux_mean_dummy
     &                  , xx_swdown_mean_dummy
     &                  , xx_snowprecip_mean_dummy
     &                  , xx_lwflux_mean_dummy
     &                  , xx_lwdown_mean_dummy
     &                  , xx_evap_mean_dummy
     &                  , xx_apressure_mean_dummy
     &                  , xx_runoff_mean_dummy
     &                  , xx_uwind_mean_dummy
     &                  , xx_vwind_mean_dummy
     &                  , xx_theta_ini_fin_dummy
     &                  , xx_salt_ini_fin_dummy
     &                  , xx_smrareabar_mean_dummy
     &                  , xx_smrsstbar_mean_dummy
     &                  , xx_smrsssbar_mean_dummy
     &                  , xx_gen2d_dummy
     &                  , xx_gen3d_dummy
cHFLUXM_CONTROL
     &                  , xx_hfluxm_dummy
cHFLUXM_CONTROL
      Real*8 xx_theta_dummy
      Real*8 xx_salt_dummy
      Real*8 xx_hflux_dummy
      Real*8 xx_sflux_dummy
      Real*8 xx_tauu_dummy
      Real*8 xx_tauv_dummy
      Real*8 xx_atemp_dummy
      Real*8 xx_aqh_dummy
      Real*8 xx_precip_dummy
      Real*8 xx_swflux_dummy
      Real*8 xx_swdown_dummy
      Real*8 xx_snowprecip_dummy
      Real*8 xx_lwflux_dummy
      Real*8 xx_lwdown_dummy
      Real*8 xx_evap_dummy
      Real*8 xx_apressure_dummy
      Real*8 xx_runoff_dummy
      Real*8 xx_uwind_dummy
      Real*8 xx_vwind_dummy
      Real*8 xx_obcsn_dummy
      Real*8 xx_obcss_dummy
      Real*8 xx_obcsw_dummy
      Real*8 xx_obcse_dummy
      Real*8 xx_diffkr_dummy
      Real*8 xx_kapgm_dummy
      Real*8 xx_kapredi_dummy
      Real*8 xx_tr1_dummy
      Real*8 xx_sst_dummy
      Real*8 xx_sss_dummy
      Real*8 xx_depth_dummy
      Real*8 xx_efluxy_dummy
      Real*8 xx_efluxp_dummy
      Real*8 xx_bottomdrag_dummy
      Real*8 xx_edtaux_dummy
      Real*8 xx_edtauy_dummy
      Real*8 xx_uvel_dummy
      Real*8 xx_vvel_dummy
      Real*8 xx_etan_dummy
      Real*8 xx_siarea_dummy
      Real*8 xx_siheff_dummy
      Real*8 xx_sihsnow_dummy
      Real*8 xx_relaxsst_dummy
      Real*8 xx_relaxsss_dummy
      Real*8 xx_gen2d_dummy
      Real*8 xx_gen3d_dummy
c
      Real*8 xx_tbar_mean_dummy
      Real*8 xx_tbar_daily_mean_dummy
      Real*8 xx_sbar_mean_dummy
      Real*8 xx_sbar_daily_mean_dummy
      Real*8 xx_ubar_mean_dummy
      Real*8 xx_vbar_mean_dummy
      Real*8 xx_wbar_mean_dummy
      Real*8 xx_psbar_mean_dummy
      Real*8 xx_bpbar_mean_dummy
      Real*8 xx_hflux_mean_dummy
      Real*8 xx_sflux_mean_dummy
      Real*8 xx_sstbar_mean_dummy
      Real*8 xx_sssbar_mean_dummy
      Real*8 xx_taux_mean_dummy
      Real*8 xx_tauy_mean_dummy
      Real*8 xx_atemp_mean_dummy
      Real*8 xx_aqh_mean_dummy
      Real*8 xx_precip_mean_dummy
      Real*8 xx_swflux_mean_dummy
      Real*8 xx_swdown_mean_dummy
      Real*8 xx_snowprecip_mean_dummy
      Real*8 xx_lwflux_mean_dummy
      Real*8 xx_lwdown_mean_dummy
      Real*8 xx_evap_mean_dummy
      Real*8 xx_apressure_mean_dummy
      Real*8 xx_runoff_mean_dummy
      Real*8 xx_uwind_mean_dummy
      Real*8 xx_vwind_mean_dummy
      Real*8 xx_theta_ini_fin_dummy
      Real*8 xx_salt_ini_fin_dummy
      Real*8 xx_smrareabar_mean_dummy
      Real*8 xx_smrsstbar_mean_dummy
      Real*8 xx_smrsssbar_mean_dummy
cHFLUXM_CONTROL
      Real*8 xx_hfluxm_dummy
cHFLUXM_CONTROL
c
c
c
c
c
c
c
c
c
      character*(5)  lsoptversion
      parameter    ( lsoptversion = '2.1.0' )
      character*(5)  offlineversion
      parameter    ( offlineversion = '0.1.1' )
c
c
      common /optiparm_i/
     &                    optimcycle,
     &                    nvars,
     &                    numiter,
     &                    nfunc,
     &                    iprint,
     &                    nupdate
      integer optimcycle
      integer nvars
      integer numiter
      integer nfunc
      integer iprint
      integer nupdate
      common /optiparm_r/
     &                    fmin,
     &                    epsf,
     &                    epsx,
     &                    epsg,
     &                    eps
      Real*8 epsf
      Real*8 epsx
      Real*8 fmin
      Real*8 epsg
      Real*8 eps
      common /optiparm_l/
     &                    nondimcontrol
      logical nondimcontrol
      common /optiparm_c/
     &                    copt
      character*( 3) copt
      character*(80) fnamegeneric
      character*(MAX_LEN_FNAM) xx_gen_file
      integer xx_genstartdate(4)
      Real*8     xx_genperiod
      Real*8     genmask(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      Real*8     genfld(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8     xx_gen0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8     xx_gen1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8     xx_gen_dummy
      Real*8     xx_gen_remo_intercept
      Real*8     xx_gen_remo_slope
      Real*8     mytime
      integer myiter
      integer mythid
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine ctrl_get_gen_rec(
     I                        xx_genstartdate,
     I                        xx_genperiod,
     O                        fac,
     O                        first,
     O                        changed,
     O                        count0,
     O                        count1,
     I                        mytime,
     I                        myiter,
     I                        mythid
     &                      )
c
c
      implicit none
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      integer xx_genstartdate(4)
      Real*8     xx_genperiod
      Real*8     fac
      logical first
      logical changed
      integer count0
      integer count1
      Real*8     mytime
      integer myiter
      integer mythid
      return
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine ctrl_init_variables( mythid )
c
c
c
      implicit none
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
      integer mythid
      integer bi,bj
      integer i,j,k
      integer itlo,ithi
      integer jtlo,jthi
      integer jmin,jmax
      integer imin,imax
      integer ntmp
      integer ivarindex
      jtlo = mybylo(mythid)
      jthi = mybyhi(mythid)
      itlo = mybxlo(mythid)
      ithi = mybxhi(mythid)
      jmin = 1-oly
      jmax = sny+oly
      imin = 1-olx
      imax = snx+olx
      return
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine ctrl_map_ini( mythid )
      implicit none
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
c
c
      common /ctrl_dummy/
     &                    xx_theta_dummy
     &                  , xx_salt_dummy
     &                  , xx_hflux_dummy
     &                  , xx_sflux_dummy
     &                  , xx_tauu_dummy
     &                  , xx_tauv_dummy
     &                  , xx_atemp_dummy
     &                  , xx_aqh_dummy
     &                  , xx_precip_dummy
     &                  , xx_swflux_dummy
     &                  , xx_swdown_dummy
     &                  , xx_snowprecip_dummy
     &                  , xx_lwflux_dummy
     &                  , xx_lwdown_dummy
     &                  , xx_evap_dummy
     &                  , xx_apressure_dummy
     &                  , xx_runoff_dummy
     &                  , xx_uwind_dummy
     &                  , xx_vwind_dummy
     &                  , xx_obcsn_dummy
     &                  , xx_obcss_dummy
     &                  , xx_obcsw_dummy
     &                  , xx_obcse_dummy
     &                  , xx_diffkr_dummy
     &                  , xx_kapgm_dummy
     &                  , xx_kapredi_dummy
     &                  , xx_tr1_dummy
     &                  , xx_sst_dummy
     &                  , xx_sss_dummy
     &                  , xx_depth_dummy
     &                  , xx_efluxy_dummy
     &                  , xx_efluxp_dummy
     &                  , xx_bottomdrag_dummy
     &                  , xx_edtaux_dummy
     &                  , xx_edtauy_dummy
     &                  , xx_uvel_dummy
     &                  , xx_vvel_dummy
     &                  , xx_etan_dummy
     &                  , xx_siarea_dummy
     &                  , xx_siheff_dummy
     &                  , xx_sihsnow_dummy
     &                  , xx_relaxsst_dummy
     &                  , xx_relaxsss_dummy
     &                  , xx_tbar_mean_dummy
     &                  , xx_tbar_daily_mean_dummy
     &                  , xx_sbar_mean_dummy
     &                  , xx_sbar_daily_mean_dummy
     &                  , xx_ubar_mean_dummy
     &                  , xx_vbar_mean_dummy
     &                  , xx_wbar_mean_dummy
     &                  , xx_psbar_mean_dummy
     &                  , xx_bpbar_mean_dummy
     &                  , xx_taux_mean_dummy
     &                  , xx_tauy_mean_dummy
     &                  , xx_hflux_mean_dummy
     &                  , xx_sflux_mean_dummy
     &                  , xx_sstbar_mean_dummy
     &                  , xx_sssbar_mean_dummy
     &                  , xx_atemp_mean_dummy
     &                  , xx_aqh_mean_dummy
     &                  , xx_precip_mean_dummy
     &                  , xx_swflux_mean_dummy
     &                  , xx_swdown_mean_dummy
     &                  , xx_snowprecip_mean_dummy
     &                  , xx_lwflux_mean_dummy
     &                  , xx_lwdown_mean_dummy
     &                  , xx_evap_mean_dummy
     &                  , xx_apressure_mean_dummy
     &                  , xx_runoff_mean_dummy
     &                  , xx_uwind_mean_dummy
     &                  , xx_vwind_mean_dummy
     &                  , xx_theta_ini_fin_dummy
     &                  , xx_salt_ini_fin_dummy
     &                  , xx_smrareabar_mean_dummy
     &                  , xx_smrsstbar_mean_dummy
     &                  , xx_smrsssbar_mean_dummy
     &                  , xx_gen2d_dummy
     &                  , xx_gen3d_dummy
cHFLUXM_CONTROL
     &                  , xx_hfluxm_dummy
cHFLUXM_CONTROL
      Real*8 xx_theta_dummy
      Real*8 xx_salt_dummy
      Real*8 xx_hflux_dummy
      Real*8 xx_sflux_dummy
      Real*8 xx_tauu_dummy
      Real*8 xx_tauv_dummy
      Real*8 xx_atemp_dummy
      Real*8 xx_aqh_dummy
      Real*8 xx_precip_dummy
      Real*8 xx_swflux_dummy
      Real*8 xx_swdown_dummy
      Real*8 xx_snowprecip_dummy
      Real*8 xx_lwflux_dummy
      Real*8 xx_lwdown_dummy
      Real*8 xx_evap_dummy
      Real*8 xx_apressure_dummy
      Real*8 xx_runoff_dummy
      Real*8 xx_uwind_dummy
      Real*8 xx_vwind_dummy
      Real*8 xx_obcsn_dummy
      Real*8 xx_obcss_dummy
      Real*8 xx_obcsw_dummy
      Real*8 xx_obcse_dummy
      Real*8 xx_diffkr_dummy
      Real*8 xx_kapgm_dummy
      Real*8 xx_kapredi_dummy
      Real*8 xx_tr1_dummy
      Real*8 xx_sst_dummy
      Real*8 xx_sss_dummy
      Real*8 xx_depth_dummy
      Real*8 xx_efluxy_dummy
      Real*8 xx_efluxp_dummy
      Real*8 xx_bottomdrag_dummy
      Real*8 xx_edtaux_dummy
      Real*8 xx_edtauy_dummy
      Real*8 xx_uvel_dummy
      Real*8 xx_vvel_dummy
      Real*8 xx_etan_dummy
      Real*8 xx_siarea_dummy
      Real*8 xx_siheff_dummy
      Real*8 xx_sihsnow_dummy
      Real*8 xx_relaxsst_dummy
      Real*8 xx_relaxsss_dummy
      Real*8 xx_gen2d_dummy
      Real*8 xx_gen3d_dummy
c
      Real*8 xx_tbar_mean_dummy
      Real*8 xx_tbar_daily_mean_dummy
      Real*8 xx_sbar_mean_dummy
      Real*8 xx_sbar_daily_mean_dummy
      Real*8 xx_ubar_mean_dummy
      Real*8 xx_vbar_mean_dummy
      Real*8 xx_wbar_mean_dummy
      Real*8 xx_psbar_mean_dummy
      Real*8 xx_bpbar_mean_dummy
      Real*8 xx_hflux_mean_dummy
      Real*8 xx_sflux_mean_dummy
      Real*8 xx_sstbar_mean_dummy
      Real*8 xx_sssbar_mean_dummy
      Real*8 xx_taux_mean_dummy
      Real*8 xx_tauy_mean_dummy
      Real*8 xx_atemp_mean_dummy
      Real*8 xx_aqh_mean_dummy
      Real*8 xx_precip_mean_dummy
      Real*8 xx_swflux_mean_dummy
      Real*8 xx_swdown_mean_dummy
      Real*8 xx_snowprecip_mean_dummy
      Real*8 xx_lwflux_mean_dummy
      Real*8 xx_lwdown_mean_dummy
      Real*8 xx_evap_mean_dummy
      Real*8 xx_apressure_mean_dummy
      Real*8 xx_runoff_mean_dummy
      Real*8 xx_uwind_mean_dummy
      Real*8 xx_vwind_mean_dummy
      Real*8 xx_theta_ini_fin_dummy
      Real*8 xx_salt_ini_fin_dummy
      Real*8 xx_smrareabar_mean_dummy
      Real*8 xx_smrsstbar_mean_dummy
      Real*8 xx_smrsssbar_mean_dummy
cHFLUXM_CONTROL
      Real*8 xx_hfluxm_dummy
cHFLUXM_CONTROL
c
c
c
c
c
c
c
c
c
      character*(5)  lsoptversion
      parameter    ( lsoptversion = '2.1.0' )
      character*(5)  offlineversion
      parameter    ( offlineversion = '0.1.1' )
c
c
      common /optiparm_i/
     &                    optimcycle,
     &                    nvars,
     &                    numiter,
     &                    nfunc,
     &                    iprint,
     &                    nupdate
      integer optimcycle
      integer nvars
      integer numiter
      integer nfunc
      integer iprint
      integer nupdate
      common /optiparm_r/
     &                    fmin,
     &                    epsf,
     &                    epsx,
     &                    epsg,
     &                    eps
      Real*8 epsf
      Real*8 epsx
      Real*8 fmin
      Real*8 epsg
      Real*8 eps
      common /optiparm_l/
     &                    nondimcontrol
      logical nondimcontrol
      common /optiparm_c/
     &                    copt
      character*( 3) copt
      integer mythid
      integer bi,bj
      integer i,j,k
      integer itlo,ithi
      integer jtlo,jthi
      integer jmin,jmax
      integer imin,imax
      integer il
      logical equal
      logical doglobalread
      logical ladinit
      character*( 80)   fnamegeneric
      Real*8     fac
      Real*8 tmptest
      integer  ilnblnk
      external ilnblnk
      jtlo = mybylo(mythid)
      jthi = mybyhi(mythid)
      itlo = mybxlo(mythid)
      ithi = mybxhi(mythid)
      jmin = 1
      jmax = sny
      imin = 1
      imax = snx
      doglobalread = .false.
      ladinit      = .false.
      equal = .true.
      if ( equal ) then
        fac = 1.d0
      else
        fac = 0.d0
      endif
      return
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine ctrl_map_ini_ecco( mythid )
c
c
c
c
c
c
      implicit none
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
 
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
c
c
      common /ctrl_dummy/
     &                    xx_theta_dummy
     &                  , xx_salt_dummy
     &                  , xx_hflux_dummy
     &                  , xx_sflux_dummy
     &                  , xx_tauu_dummy
     &                  , xx_tauv_dummy
     &                  , xx_atemp_dummy
     &                  , xx_aqh_dummy
     &                  , xx_precip_dummy
     &                  , xx_swflux_dummy
     &                  , xx_swdown_dummy
     &                  , xx_snowprecip_dummy
     &                  , xx_lwflux_dummy
     &                  , xx_lwdown_dummy
     &                  , xx_evap_dummy
     &                  , xx_apressure_dummy
     &                  , xx_runoff_dummy
     &                  , xx_uwind_dummy
     &                  , xx_vwind_dummy
     &                  , xx_obcsn_dummy
     &                  , xx_obcss_dummy
     &                  , xx_obcsw_dummy
     &                  , xx_obcse_dummy
     &                  , xx_diffkr_dummy
     &                  , xx_kapgm_dummy
     &                  , xx_kapredi_dummy
     &                  , xx_tr1_dummy
     &                  , xx_sst_dummy
     &                  , xx_sss_dummy
     &                  , xx_depth_dummy
     &                  , xx_efluxy_dummy
     &                  , xx_efluxp_dummy
     &                  , xx_bottomdrag_dummy
     &                  , xx_edtaux_dummy
     &                  , xx_edtauy_dummy
     &                  , xx_uvel_dummy
     &                  , xx_vvel_dummy
     &                  , xx_etan_dummy
     &                  , xx_siarea_dummy
     &                  , xx_siheff_dummy
     &                  , xx_sihsnow_dummy
     &                  , xx_relaxsst_dummy
     &                  , xx_relaxsss_dummy
     &                  , xx_tbar_mean_dummy
     &                  , xx_tbar_daily_mean_dummy
     &                  , xx_sbar_mean_dummy
     &                  , xx_sbar_daily_mean_dummy
     &                  , xx_ubar_mean_dummy
     &                  , xx_vbar_mean_dummy
     &                  , xx_wbar_mean_dummy
     &                  , xx_psbar_mean_dummy
     &                  , xx_bpbar_mean_dummy
     &                  , xx_taux_mean_dummy
     &                  , xx_tauy_mean_dummy
     &                  , xx_hflux_mean_dummy
     &                  , xx_sflux_mean_dummy
     &                  , xx_sstbar_mean_dummy
     &                  , xx_sssbar_mean_dummy
     &                  , xx_atemp_mean_dummy
     &                  , xx_aqh_mean_dummy
     &                  , xx_precip_mean_dummy
     &                  , xx_swflux_mean_dummy
     &                  , xx_swdown_mean_dummy
     &                  , xx_snowprecip_mean_dummy
     &                  , xx_lwflux_mean_dummy
     &                  , xx_lwdown_mean_dummy
     &                  , xx_evap_mean_dummy
     &                  , xx_apressure_mean_dummy
     &                  , xx_runoff_mean_dummy
     &                  , xx_uwind_mean_dummy
     &                  , xx_vwind_mean_dummy
     &                  , xx_theta_ini_fin_dummy
     &                  , xx_salt_ini_fin_dummy
     &                  , xx_smrareabar_mean_dummy
     &                  , xx_smrsstbar_mean_dummy
     &                  , xx_smrsssbar_mean_dummy
     &                  , xx_gen2d_dummy
     &                  , xx_gen3d_dummy
cHFLUXM_CONTROL
     &                  , xx_hfluxm_dummy
cHFLUXM_CONTROL
      Real*8 xx_theta_dummy
      Real*8 xx_salt_dummy
      Real*8 xx_hflux_dummy
      Real*8 xx_sflux_dummy
      Real*8 xx_tauu_dummy
      Real*8 xx_tauv_dummy
      Real*8 xx_atemp_dummy
      Real*8 xx_aqh_dummy
      Real*8 xx_precip_dummy
      Real*8 xx_swflux_dummy
      Real*8 xx_swdown_dummy
      Real*8 xx_snowprecip_dummy
      Real*8 xx_lwflux_dummy
      Real*8 xx_lwdown_dummy
      Real*8 xx_evap_dummy
      Real*8 xx_apressure_dummy
      Real*8 xx_runoff_dummy
      Real*8 xx_uwind_dummy
      Real*8 xx_vwind_dummy
      Real*8 xx_obcsn_dummy
      Real*8 xx_obcss_dummy
      Real*8 xx_obcsw_dummy
      Real*8 xx_obcse_dummy
      Real*8 xx_diffkr_dummy
      Real*8 xx_kapgm_dummy
      Real*8 xx_kapredi_dummy
      Real*8 xx_tr1_dummy
      Real*8 xx_sst_dummy
      Real*8 xx_sss_dummy
      Real*8 xx_depth_dummy
      Real*8 xx_efluxy_dummy
      Real*8 xx_efluxp_dummy
      Real*8 xx_bottomdrag_dummy
      Real*8 xx_edtaux_dummy
      Real*8 xx_edtauy_dummy
      Real*8 xx_uvel_dummy
      Real*8 xx_vvel_dummy
      Real*8 xx_etan_dummy
      Real*8 xx_siarea_dummy
      Real*8 xx_siheff_dummy
      Real*8 xx_sihsnow_dummy
      Real*8 xx_relaxsst_dummy
      Real*8 xx_relaxsss_dummy
      Real*8 xx_gen2d_dummy
      Real*8 xx_gen3d_dummy
c
      Real*8 xx_tbar_mean_dummy
      Real*8 xx_tbar_daily_mean_dummy
      Real*8 xx_sbar_mean_dummy
      Real*8 xx_sbar_daily_mean_dummy
      Real*8 xx_ubar_mean_dummy
      Real*8 xx_vbar_mean_dummy
      Real*8 xx_wbar_mean_dummy
      Real*8 xx_psbar_mean_dummy
      Real*8 xx_bpbar_mean_dummy
      Real*8 xx_hflux_mean_dummy
      Real*8 xx_sflux_mean_dummy
      Real*8 xx_sstbar_mean_dummy
      Real*8 xx_sssbar_mean_dummy
      Real*8 xx_taux_mean_dummy
      Real*8 xx_tauy_mean_dummy
      Real*8 xx_atemp_mean_dummy
      Real*8 xx_aqh_mean_dummy
      Real*8 xx_precip_mean_dummy
      Real*8 xx_swflux_mean_dummy
      Real*8 xx_swdown_mean_dummy
      Real*8 xx_snowprecip_mean_dummy
      Real*8 xx_lwflux_mean_dummy
      Real*8 xx_lwdown_mean_dummy
      Real*8 xx_evap_mean_dummy
      Real*8 xx_apressure_mean_dummy
      Real*8 xx_runoff_mean_dummy
      Real*8 xx_uwind_mean_dummy
      Real*8 xx_vwind_mean_dummy
      Real*8 xx_theta_ini_fin_dummy
      Real*8 xx_salt_ini_fin_dummy
      Real*8 xx_smrareabar_mean_dummy
      Real*8 xx_smrsstbar_mean_dummy
      Real*8 xx_smrsssbar_mean_dummy
cHFLUXM_CONTROL
      Real*8 xx_hfluxm_dummy
cHFLUXM_CONTROL
c
c
c
c
c
c
c
c
c
      character*(5)  lsoptversion
      parameter    ( lsoptversion = '2.1.0' )
      character*(5)  offlineversion
      parameter    ( offlineversion = '0.1.1' )
c
c
      common /optiparm_i/
     &                    optimcycle,
     &                    nvars,
     &                    numiter,
     &                    nfunc,
     &                    iprint,
     &                    nupdate
      integer optimcycle
      integer nvars
      integer numiter
      integer nfunc
      integer iprint
      integer nupdate
      common /optiparm_r/
     &                    fmin,
     &                    epsf,
     &                    epsx,
     &                    epsg,
     &                    eps
      Real*8 epsf
      Real*8 epsx
      Real*8 fmin
      Real*8 epsg
      Real*8 eps
      common /optiparm_l/
     &                    nondimcontrol
      logical nondimcontrol
      common /optiparm_c/
     &                    copt
      character*( 3) copt
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      integer mythid
      return
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine ctrl_map_ini_gen3D(xxFileCur, wFileCur, xxDummyCur,
     & boundsVec, paramFld3d, maskFld3d, paramSmooth, mythid )
c
c
c
      implicit none
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
c
c
      common /ctrl_dummy/
     &                    xx_theta_dummy
     &                  , xx_salt_dummy
     &                  , xx_hflux_dummy
     &                  , xx_sflux_dummy
     &                  , xx_tauu_dummy
     &                  , xx_tauv_dummy
     &                  , xx_atemp_dummy
     &                  , xx_aqh_dummy
     &                  , xx_precip_dummy
     &                  , xx_swflux_dummy
     &                  , xx_swdown_dummy
     &                  , xx_snowprecip_dummy
     &                  , xx_lwflux_dummy
     &                  , xx_lwdown_dummy
     &                  , xx_evap_dummy
     &                  , xx_apressure_dummy
     &                  , xx_runoff_dummy
     &                  , xx_uwind_dummy
     &                  , xx_vwind_dummy
     &                  , xx_obcsn_dummy
     &                  , xx_obcss_dummy
     &                  , xx_obcsw_dummy
     &                  , xx_obcse_dummy
     &                  , xx_diffkr_dummy
     &                  , xx_kapgm_dummy
     &                  , xx_kapredi_dummy
     &                  , xx_tr1_dummy
     &                  , xx_sst_dummy
     &                  , xx_sss_dummy
     &                  , xx_depth_dummy
     &                  , xx_efluxy_dummy
     &                  , xx_efluxp_dummy
     &                  , xx_bottomdrag_dummy
     &                  , xx_edtaux_dummy
     &                  , xx_edtauy_dummy
     &                  , xx_uvel_dummy
     &                  , xx_vvel_dummy
     &                  , xx_etan_dummy
     &                  , xx_siarea_dummy
     &                  , xx_siheff_dummy
     &                  , xx_sihsnow_dummy
     &                  , xx_relaxsst_dummy
     &                  , xx_relaxsss_dummy
     &                  , xx_tbar_mean_dummy
     &                  , xx_tbar_daily_mean_dummy
     &                  , xx_sbar_mean_dummy
     &                  , xx_sbar_daily_mean_dummy
     &                  , xx_ubar_mean_dummy
     &                  , xx_vbar_mean_dummy
     &                  , xx_wbar_mean_dummy
     &                  , xx_psbar_mean_dummy
     &                  , xx_bpbar_mean_dummy
     &                  , xx_taux_mean_dummy
     &                  , xx_tauy_mean_dummy
     &                  , xx_hflux_mean_dummy
     &                  , xx_sflux_mean_dummy
     &                  , xx_sstbar_mean_dummy
     &                  , xx_sssbar_mean_dummy
     &                  , xx_atemp_mean_dummy
     &                  , xx_aqh_mean_dummy
     &                  , xx_precip_mean_dummy
     &                  , xx_swflux_mean_dummy
     &                  , xx_swdown_mean_dummy
     &                  , xx_snowprecip_mean_dummy
     &                  , xx_lwflux_mean_dummy
     &                  , xx_lwdown_mean_dummy
     &                  , xx_evap_mean_dummy
     &                  , xx_apressure_mean_dummy
     &                  , xx_runoff_mean_dummy
     &                  , xx_uwind_mean_dummy
     &                  , xx_vwind_mean_dummy
     &                  , xx_theta_ini_fin_dummy
     &                  , xx_salt_ini_fin_dummy
     &                  , xx_smrareabar_mean_dummy
     &                  , xx_smrsstbar_mean_dummy
     &                  , xx_smrsssbar_mean_dummy
     &                  , xx_gen2d_dummy
     &                  , xx_gen3d_dummy
cHFLUXM_CONTROL
     &                  , xx_hfluxm_dummy
cHFLUXM_CONTROL
      Real*8 xx_theta_dummy
      Real*8 xx_salt_dummy
      Real*8 xx_hflux_dummy
      Real*8 xx_sflux_dummy
      Real*8 xx_tauu_dummy
      Real*8 xx_tauv_dummy
      Real*8 xx_atemp_dummy
      Real*8 xx_aqh_dummy
      Real*8 xx_precip_dummy
      Real*8 xx_swflux_dummy
      Real*8 xx_swdown_dummy
      Real*8 xx_snowprecip_dummy
      Real*8 xx_lwflux_dummy
      Real*8 xx_lwdown_dummy
      Real*8 xx_evap_dummy
      Real*8 xx_apressure_dummy
      Real*8 xx_runoff_dummy
      Real*8 xx_uwind_dummy
      Real*8 xx_vwind_dummy
      Real*8 xx_obcsn_dummy
      Real*8 xx_obcss_dummy
      Real*8 xx_obcsw_dummy
      Real*8 xx_obcse_dummy
      Real*8 xx_diffkr_dummy
      Real*8 xx_kapgm_dummy
      Real*8 xx_kapredi_dummy
      Real*8 xx_tr1_dummy
      Real*8 xx_sst_dummy
      Real*8 xx_sss_dummy
      Real*8 xx_depth_dummy
      Real*8 xx_efluxy_dummy
      Real*8 xx_efluxp_dummy
      Real*8 xx_bottomdrag_dummy
      Real*8 xx_edtaux_dummy
      Real*8 xx_edtauy_dummy
      Real*8 xx_uvel_dummy
      Real*8 xx_vvel_dummy
      Real*8 xx_etan_dummy
      Real*8 xx_siarea_dummy
      Real*8 xx_siheff_dummy
      Real*8 xx_sihsnow_dummy
      Real*8 xx_relaxsst_dummy
      Real*8 xx_relaxsss_dummy
      Real*8 xx_gen2d_dummy
      Real*8 xx_gen3d_dummy
c
      Real*8 xx_tbar_mean_dummy
      Real*8 xx_tbar_daily_mean_dummy
      Real*8 xx_sbar_mean_dummy
      Real*8 xx_sbar_daily_mean_dummy
      Real*8 xx_ubar_mean_dummy
      Real*8 xx_vbar_mean_dummy
      Real*8 xx_wbar_mean_dummy
      Real*8 xx_psbar_mean_dummy
      Real*8 xx_bpbar_mean_dummy
      Real*8 xx_hflux_mean_dummy
      Real*8 xx_sflux_mean_dummy
      Real*8 xx_sstbar_mean_dummy
      Real*8 xx_sssbar_mean_dummy
      Real*8 xx_taux_mean_dummy
      Real*8 xx_tauy_mean_dummy
      Real*8 xx_atemp_mean_dummy
      Real*8 xx_aqh_mean_dummy
      Real*8 xx_precip_mean_dummy
      Real*8 xx_swflux_mean_dummy
      Real*8 xx_swdown_mean_dummy
      Real*8 xx_snowprecip_mean_dummy
      Real*8 xx_lwflux_mean_dummy
      Real*8 xx_lwdown_mean_dummy
      Real*8 xx_evap_mean_dummy
      Real*8 xx_apressure_mean_dummy
      Real*8 xx_runoff_mean_dummy
      Real*8 xx_uwind_mean_dummy
      Real*8 xx_vwind_mean_dummy
      Real*8 xx_theta_ini_fin_dummy
      Real*8 xx_salt_ini_fin_dummy
      Real*8 xx_smrareabar_mean_dummy
      Real*8 xx_smrsstbar_mean_dummy
      Real*8 xx_smrsssbar_mean_dummy
cHFLUXM_CONTROL
      Real*8 xx_hfluxm_dummy
cHFLUXM_CONTROL
c
c
c
c
c
c
c
c
c
      character*(5)  lsoptversion
      parameter    ( lsoptversion = '2.1.0' )
      character*(5)  offlineversion
      parameter    ( offlineversion = '0.1.1' )
c
c
      common /optiparm_i/
     &                    optimcycle,
     &                    nvars,
     &                    numiter,
     &                    nfunc,
     &                    iprint,
     &                    nupdate
      integer optimcycle
      integer nvars
      integer numiter
      integer nfunc
      integer iprint
      integer nupdate
      common /optiparm_r/
     &                    fmin,
     &                    epsf,
     &                    epsx,
     &                    epsg,
     &                    eps
      Real*8 epsf
      Real*8 epsx
      Real*8 fmin
      Real*8 epsg
      Real*8 eps
      common /optiparm_l/
     &                    nondimcontrol
      logical nondimcontrol
      common /optiparm_c/
     &                    copt
      character*( 3) copt
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      integer mythid
      character*(*) wFileCur,xxFileCur
      Real*8 boundsVec(5),tmpMax,xxDummyCur
      Real*8 wFld3d(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      Real*8 xxFld3d(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      Real*8 paramFld3d(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      Real*8 maskFld3d(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer paramSmooth
      integer bi,bj
      integer i,j,k
      integer itlo,ithi
      integer jtlo,jthi
      integer jmin,jmax
      integer imin,imax
      integer il
      logical doglobalread
      logical ladinit
      character*( 80) fnamegeneric
      integer  ilnblnk
      external ilnblnk
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = 0
          ikey = (act3 + 1) + act4*max3
      jtlo = mybylo(mythid)
      jthi = mybyhi(mythid)
      itlo = mybxlo(mythid)
      ithi = mybxhi(mythid)
      jmin = 1
      jmax = sny
      imin = 1
      imax = snx
      doglobalread = .false.
      ladinit      = .false.
      call mdsreadfield(wFileCur,32,'RL',nR,wFld3d,1,mythid)
      CALL EXCH_XYZ_RL (  wFld3d,  mythid  )
      il=ilnblnk( xxFileCur )
      write(fnamegeneric(1:80),'(2a,i10.10)')
     &     xxFileCur(1:il),'.',optimcycle
      call active_read_xyz( fnamegeneric, xxFld3d, 1,
     & doglobalread, ladinit, optimcycle, mythid, xxDummyCur )
      if ( boundsVec(5).GT.0.) then
      do bj = jtlo,jthi
        do bi = itlo,ithi
          do k = 1,nr
            do j = jmin,jmax
              do i = imin,imax
      if ( (maskFld3d(i,j,k,bi,bj).NE.0.).AND.
     & (wFld3d(i,j,k,bi,bj).GT.0.) ) then
       tmpMax=boundsVec(5)/sqrt(wFld3d(i,j,k,bi,bj))
      if ( abs(xxFld3d(i,j,k,bi,bj)).GT.tmpMax ) then
       xxFld3d(i,j,k,bi,bj)=sign(tmpMax,xxFld3d(i,j,k,bi,bj))
      else
       xxFld3d(i,j,k,bi,bj)=xxFld3d(i,j,k,bi,bj)
      endif
      endif
              enddo
            enddo
          enddo
       enddo
      enddo
      endif
      do bj = jtlo,jthi
        do bi = itlo,ithi
          do k = 1,nr
            do j = jmin,jmax
              do i = imin,imax
      paramFld3d(i,j,k,bi,bj) = paramFld3d(i,j,k,bi,bj)
     & + xxFld3d(i,j,k,bi,bj)
              enddo
            enddo
          enddo
       enddo
      enddo
      CALL CTRL_BOUND_3D(paramFld3d,maskFld3d,boundsVec,myThid)
       end
      subroutine ctrl_map_ini_gen2D(xxFileCur, wFileCur, xxDummyCur,
     & boundsVec, paramFld2d, maskFld3d, paramSmooth, mythid )
c
c
c
      implicit none
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
c
c
      common /ctrl_dummy/
     &                    xx_theta_dummy
     &                  , xx_salt_dummy
     &                  , xx_hflux_dummy
     &                  , xx_sflux_dummy
     &                  , xx_tauu_dummy
     &                  , xx_tauv_dummy
     &                  , xx_atemp_dummy
     &                  , xx_aqh_dummy
     &                  , xx_precip_dummy
     &                  , xx_swflux_dummy
     &                  , xx_swdown_dummy
     &                  , xx_snowprecip_dummy
     &                  , xx_lwflux_dummy
     &                  , xx_lwdown_dummy
     &                  , xx_evap_dummy
     &                  , xx_apressure_dummy
     &                  , xx_runoff_dummy
     &                  , xx_uwind_dummy
     &                  , xx_vwind_dummy
     &                  , xx_obcsn_dummy
     &                  , xx_obcss_dummy
     &                  , xx_obcsw_dummy
     &                  , xx_obcse_dummy
     &                  , xx_diffkr_dummy
     &                  , xx_kapgm_dummy
     &                  , xx_kapredi_dummy
     &                  , xx_tr1_dummy
     &                  , xx_sst_dummy
     &                  , xx_sss_dummy
     &                  , xx_depth_dummy
     &                  , xx_efluxy_dummy
     &                  , xx_efluxp_dummy
     &                  , xx_bottomdrag_dummy
     &                  , xx_edtaux_dummy
     &                  , xx_edtauy_dummy
     &                  , xx_uvel_dummy
     &                  , xx_vvel_dummy
     &                  , xx_etan_dummy
     &                  , xx_siarea_dummy
     &                  , xx_siheff_dummy
     &                  , xx_sihsnow_dummy
     &                  , xx_relaxsst_dummy
     &                  , xx_relaxsss_dummy
     &                  , xx_tbar_mean_dummy
     &                  , xx_tbar_daily_mean_dummy
     &                  , xx_sbar_mean_dummy
     &                  , xx_sbar_daily_mean_dummy
     &                  , xx_ubar_mean_dummy
     &                  , xx_vbar_mean_dummy
     &                  , xx_wbar_mean_dummy
     &                  , xx_psbar_mean_dummy
     &                  , xx_bpbar_mean_dummy
     &                  , xx_taux_mean_dummy
     &                  , xx_tauy_mean_dummy
     &                  , xx_hflux_mean_dummy
     &                  , xx_sflux_mean_dummy
     &                  , xx_sstbar_mean_dummy
     &                  , xx_sssbar_mean_dummy
     &                  , xx_atemp_mean_dummy
     &                  , xx_aqh_mean_dummy
     &                  , xx_precip_mean_dummy
     &                  , xx_swflux_mean_dummy
     &                  , xx_swdown_mean_dummy
     &                  , xx_snowprecip_mean_dummy
     &                  , xx_lwflux_mean_dummy
     &                  , xx_lwdown_mean_dummy
     &                  , xx_evap_mean_dummy
     &                  , xx_apressure_mean_dummy
     &                  , xx_runoff_mean_dummy
     &                  , xx_uwind_mean_dummy
     &                  , xx_vwind_mean_dummy
     &                  , xx_theta_ini_fin_dummy
     &                  , xx_salt_ini_fin_dummy
     &                  , xx_smrareabar_mean_dummy
     &                  , xx_smrsstbar_mean_dummy
     &                  , xx_smrsssbar_mean_dummy
     &                  , xx_gen2d_dummy
     &                  , xx_gen3d_dummy
cHFLUXM_CONTROL
     &                  , xx_hfluxm_dummy
cHFLUXM_CONTROL
      Real*8 xx_theta_dummy
      Real*8 xx_salt_dummy
      Real*8 xx_hflux_dummy
      Real*8 xx_sflux_dummy
      Real*8 xx_tauu_dummy
      Real*8 xx_tauv_dummy
      Real*8 xx_atemp_dummy
      Real*8 xx_aqh_dummy
      Real*8 xx_precip_dummy
      Real*8 xx_swflux_dummy
      Real*8 xx_swdown_dummy
      Real*8 xx_snowprecip_dummy
      Real*8 xx_lwflux_dummy
      Real*8 xx_lwdown_dummy
      Real*8 xx_evap_dummy
      Real*8 xx_apressure_dummy
      Real*8 xx_runoff_dummy
      Real*8 xx_uwind_dummy
      Real*8 xx_vwind_dummy
      Real*8 xx_obcsn_dummy
      Real*8 xx_obcss_dummy
      Real*8 xx_obcsw_dummy
      Real*8 xx_obcse_dummy
      Real*8 xx_diffkr_dummy
      Real*8 xx_kapgm_dummy
      Real*8 xx_kapredi_dummy
      Real*8 xx_tr1_dummy
      Real*8 xx_sst_dummy
      Real*8 xx_sss_dummy
      Real*8 xx_depth_dummy
      Real*8 xx_efluxy_dummy
      Real*8 xx_efluxp_dummy
      Real*8 xx_bottomdrag_dummy
      Real*8 xx_edtaux_dummy
      Real*8 xx_edtauy_dummy
      Real*8 xx_uvel_dummy
      Real*8 xx_vvel_dummy
      Real*8 xx_etan_dummy
      Real*8 xx_siarea_dummy
      Real*8 xx_siheff_dummy
      Real*8 xx_sihsnow_dummy
      Real*8 xx_relaxsst_dummy
      Real*8 xx_relaxsss_dummy
      Real*8 xx_gen2d_dummy
      Real*8 xx_gen3d_dummy
c
      Real*8 xx_tbar_mean_dummy
      Real*8 xx_tbar_daily_mean_dummy
      Real*8 xx_sbar_mean_dummy
      Real*8 xx_sbar_daily_mean_dummy
      Real*8 xx_ubar_mean_dummy
      Real*8 xx_vbar_mean_dummy
      Real*8 xx_wbar_mean_dummy
      Real*8 xx_psbar_mean_dummy
      Real*8 xx_bpbar_mean_dummy
      Real*8 xx_hflux_mean_dummy
      Real*8 xx_sflux_mean_dummy
      Real*8 xx_sstbar_mean_dummy
      Real*8 xx_sssbar_mean_dummy
      Real*8 xx_taux_mean_dummy
      Real*8 xx_tauy_mean_dummy
      Real*8 xx_atemp_mean_dummy
      Real*8 xx_aqh_mean_dummy
      Real*8 xx_precip_mean_dummy
      Real*8 xx_swflux_mean_dummy
      Real*8 xx_swdown_mean_dummy
      Real*8 xx_snowprecip_mean_dummy
      Real*8 xx_lwflux_mean_dummy
      Real*8 xx_lwdown_mean_dummy
      Real*8 xx_evap_mean_dummy
      Real*8 xx_apressure_mean_dummy
      Real*8 xx_runoff_mean_dummy
      Real*8 xx_uwind_mean_dummy
      Real*8 xx_vwind_mean_dummy
      Real*8 xx_theta_ini_fin_dummy
      Real*8 xx_salt_ini_fin_dummy
      Real*8 xx_smrareabar_mean_dummy
      Real*8 xx_smrsstbar_mean_dummy
      Real*8 xx_smrsssbar_mean_dummy
cHFLUXM_CONTROL
      Real*8 xx_hfluxm_dummy
cHFLUXM_CONTROL
c
c
c
c
c
c
c
c
c
      character*(5)  lsoptversion
      parameter    ( lsoptversion = '2.1.0' )
      character*(5)  offlineversion
      parameter    ( offlineversion = '0.1.1' )
c
c
      common /optiparm_i/
     &                    optimcycle,
     &                    nvars,
     &                    numiter,
     &                    nfunc,
     &                    iprint,
     &                    nupdate
      integer optimcycle
      integer nvars
      integer numiter
      integer nfunc
      integer iprint
      integer nupdate
      common /optiparm_r/
     &                    fmin,
     &                    epsf,
     &                    epsx,
     &                    epsg,
     &                    eps
      Real*8 epsf
      Real*8 epsx
      Real*8 fmin
      Real*8 epsg
      Real*8 eps
      common /optiparm_l/
     &                    nondimcontrol
      logical nondimcontrol
      common /optiparm_c/
     &                    copt
      character*( 3) copt
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      integer mythid
      character*(*) wFileCur,xxFileCur
      Real*8 boundsVec(5),tmpMax,xxDummyCur
      Real*8 wFld2d(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 xxFld2d(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 paramFld2d(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 maskFld3d(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer paramSmooth
      integer bi,bj
      integer i,j,k
      integer itlo,ithi
      integer jtlo,jthi
      integer jmin,jmax
      integer imin,imax
      integer il
      logical doglobalread
      logical ladinit
      character*( 80) fnamegeneric
      integer  ilnblnk
      external ilnblnk
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = 0
          ikey = (act3 + 1) + act4*max3
      jtlo = mybylo(mythid)
      jthi = mybyhi(mythid)
      itlo = mybxlo(mythid)
      ithi = mybxhi(mythid)
      jmin = 1
      jmax = sny
      imin = 1
      imax = snx
      doglobalread = .false.
      ladinit      = .false.
      call mdsreadfield(wFileCur,32,'RL',1,wFld2d,1,mythid)
      CALL EXCH_XY_RL (  wFld2d,  mythid  )
      il=ilnblnk( xxFileCur )
      write(fnamegeneric(1:80),'(2a,i10.10)')
     &     xxFileCur(1:il),'.',optimcycle
      call active_read_xy( fnamegeneric, xxFld2d, 1,
     & doglobalread, ladinit, optimcycle, mythid, xxDummyCur )
      if ( boundsVec(5).GT.0.) then
      do bj = jtlo,jthi
        do bi = itlo,ithi
            do j = jmin,jmax
              do i = imin,imax
      if ( (maskFld3d(i,j,1,bi,bj).NE.0.).AND.
     & (wFld2d(i,j,bi,bj).GT.0.) ) then
       tmpMax=boundsVec(5)/sqrt(wFld2d(i,j,bi,bj))
      if ( abs(xxFld2d(i,j,bi,bj)).GT.tmpMax ) then
       xxFld2d(i,j,bi,bj)=sign(tmpMax,xxFld2d(i,j,bi,bj))
      else
       xxFld2d(i,j,bi,bj)=xxFld2d(i,j,bi,bj)
      endif
      endif
              enddo
            enddo
       enddo
      enddo
      endif
      do bj = jtlo,jthi
        do bi = itlo,ithi
            do j = jmin,jmax
              do i = imin,imax
      paramFld2d(i,j,bi,bj) = paramFld2d(i,j,bi,bj)
     & + xxFld2d(i,j,bi,bj)
              enddo
            enddo
       enddo
      enddo
      CALL CTRL_BOUND_2D(paramFld2d,maskFld3d,boundsVec,myThid)
       end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE CTRL_MAP_FORCING(myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
c
c
      common /ctrl_dummy/
     &                    xx_theta_dummy
     &                  , xx_salt_dummy
     &                  , xx_hflux_dummy
     &                  , xx_sflux_dummy
     &                  , xx_tauu_dummy
     &                  , xx_tauv_dummy
     &                  , xx_atemp_dummy
     &                  , xx_aqh_dummy
     &                  , xx_precip_dummy
     &                  , xx_swflux_dummy
     &                  , xx_swdown_dummy
     &                  , xx_snowprecip_dummy
     &                  , xx_lwflux_dummy
     &                  , xx_lwdown_dummy
     &                  , xx_evap_dummy
     &                  , xx_apressure_dummy
     &                  , xx_runoff_dummy
     &                  , xx_uwind_dummy
     &                  , xx_vwind_dummy
     &                  , xx_obcsn_dummy
     &                  , xx_obcss_dummy
     &                  , xx_obcsw_dummy
     &                  , xx_obcse_dummy
     &                  , xx_diffkr_dummy
     &                  , xx_kapgm_dummy
     &                  , xx_kapredi_dummy
     &                  , xx_tr1_dummy
     &                  , xx_sst_dummy
     &                  , xx_sss_dummy
     &                  , xx_depth_dummy
     &                  , xx_efluxy_dummy
     &                  , xx_efluxp_dummy
     &                  , xx_bottomdrag_dummy
     &                  , xx_edtaux_dummy
     &                  , xx_edtauy_dummy
     &                  , xx_uvel_dummy
     &                  , xx_vvel_dummy
     &                  , xx_etan_dummy
     &                  , xx_siarea_dummy
     &                  , xx_siheff_dummy
     &                  , xx_sihsnow_dummy
     &                  , xx_relaxsst_dummy
     &                  , xx_relaxsss_dummy
     &                  , xx_tbar_mean_dummy
     &                  , xx_tbar_daily_mean_dummy
     &                  , xx_sbar_mean_dummy
     &                  , xx_sbar_daily_mean_dummy
     &                  , xx_ubar_mean_dummy
     &                  , xx_vbar_mean_dummy
     &                  , xx_wbar_mean_dummy
     &                  , xx_psbar_mean_dummy
     &                  , xx_bpbar_mean_dummy
     &                  , xx_taux_mean_dummy
     &                  , xx_tauy_mean_dummy
     &                  , xx_hflux_mean_dummy
     &                  , xx_sflux_mean_dummy
     &                  , xx_sstbar_mean_dummy
     &                  , xx_sssbar_mean_dummy
     &                  , xx_atemp_mean_dummy
     &                  , xx_aqh_mean_dummy
     &                  , xx_precip_mean_dummy
     &                  , xx_swflux_mean_dummy
     &                  , xx_swdown_mean_dummy
     &                  , xx_snowprecip_mean_dummy
     &                  , xx_lwflux_mean_dummy
     &                  , xx_lwdown_mean_dummy
     &                  , xx_evap_mean_dummy
     &                  , xx_apressure_mean_dummy
     &                  , xx_runoff_mean_dummy
     &                  , xx_uwind_mean_dummy
     &                  , xx_vwind_mean_dummy
     &                  , xx_theta_ini_fin_dummy
     &                  , xx_salt_ini_fin_dummy
     &                  , xx_smrareabar_mean_dummy
     &                  , xx_smrsstbar_mean_dummy
     &                  , xx_smrsssbar_mean_dummy
     &                  , xx_gen2d_dummy
     &                  , xx_gen3d_dummy
cHFLUXM_CONTROL
     &                  , xx_hfluxm_dummy
cHFLUXM_CONTROL
      Real*8 xx_theta_dummy
      Real*8 xx_salt_dummy
      Real*8 xx_hflux_dummy
      Real*8 xx_sflux_dummy
      Real*8 xx_tauu_dummy
      Real*8 xx_tauv_dummy
      Real*8 xx_atemp_dummy
      Real*8 xx_aqh_dummy
      Real*8 xx_precip_dummy
      Real*8 xx_swflux_dummy
      Real*8 xx_swdown_dummy
      Real*8 xx_snowprecip_dummy
      Real*8 xx_lwflux_dummy
      Real*8 xx_lwdown_dummy
      Real*8 xx_evap_dummy
      Real*8 xx_apressure_dummy
      Real*8 xx_runoff_dummy
      Real*8 xx_uwind_dummy
      Real*8 xx_vwind_dummy
      Real*8 xx_obcsn_dummy
      Real*8 xx_obcss_dummy
      Real*8 xx_obcsw_dummy
      Real*8 xx_obcse_dummy
      Real*8 xx_diffkr_dummy
      Real*8 xx_kapgm_dummy
      Real*8 xx_kapredi_dummy
      Real*8 xx_tr1_dummy
      Real*8 xx_sst_dummy
      Real*8 xx_sss_dummy
      Real*8 xx_depth_dummy
      Real*8 xx_efluxy_dummy
      Real*8 xx_efluxp_dummy
      Real*8 xx_bottomdrag_dummy
      Real*8 xx_edtaux_dummy
      Real*8 xx_edtauy_dummy
      Real*8 xx_uvel_dummy
      Real*8 xx_vvel_dummy
      Real*8 xx_etan_dummy
      Real*8 xx_siarea_dummy
      Real*8 xx_siheff_dummy
      Real*8 xx_sihsnow_dummy
      Real*8 xx_relaxsst_dummy
      Real*8 xx_relaxsss_dummy
      Real*8 xx_gen2d_dummy
      Real*8 xx_gen3d_dummy
c
      Real*8 xx_tbar_mean_dummy
      Real*8 xx_tbar_daily_mean_dummy
      Real*8 xx_sbar_mean_dummy
      Real*8 xx_sbar_daily_mean_dummy
      Real*8 xx_ubar_mean_dummy
      Real*8 xx_vbar_mean_dummy
      Real*8 xx_wbar_mean_dummy
      Real*8 xx_psbar_mean_dummy
      Real*8 xx_bpbar_mean_dummy
      Real*8 xx_hflux_mean_dummy
      Real*8 xx_sflux_mean_dummy
      Real*8 xx_sstbar_mean_dummy
      Real*8 xx_sssbar_mean_dummy
      Real*8 xx_taux_mean_dummy
      Real*8 xx_tauy_mean_dummy
      Real*8 xx_atemp_mean_dummy
      Real*8 xx_aqh_mean_dummy
      Real*8 xx_precip_mean_dummy
      Real*8 xx_swflux_mean_dummy
      Real*8 xx_swdown_mean_dummy
      Real*8 xx_snowprecip_mean_dummy
      Real*8 xx_lwflux_mean_dummy
      Real*8 xx_lwdown_mean_dummy
      Real*8 xx_evap_mean_dummy
      Real*8 xx_apressure_mean_dummy
      Real*8 xx_runoff_mean_dummy
      Real*8 xx_uwind_mean_dummy
      Real*8 xx_vwind_mean_dummy
      Real*8 xx_theta_ini_fin_dummy
      Real*8 xx_salt_ini_fin_dummy
      Real*8 xx_smrareabar_mean_dummy
      Real*8 xx_smrsstbar_mean_dummy
      Real*8 xx_smrsssbar_mean_dummy
cHFLUXM_CONTROL
      Real*8 xx_hfluxm_dummy
cHFLUXM_CONTROL
c
c
c
c
c
c
c
c
c
      character*(5)  lsoptversion
      parameter    ( lsoptversion = '2.1.0' )
      character*(5)  offlineversion
      parameter    ( offlineversion = '0.1.1' )
c
c
      common /optiparm_i/
     &                    optimcycle,
     &                    nvars,
     &                    numiter,
     &                    nfunc,
     &                    iprint,
     &                    nupdate
      integer optimcycle
      integer nvars
      integer numiter
      integer nfunc
      integer iprint
      integer nupdate
      common /optiparm_r/
     &                    fmin,
     &                    epsf,
     &                    epsx,
     &                    epsg,
     &                    eps
      Real*8 epsf
      Real*8 epsx
      Real*8 fmin
      Real*8 epsg
      Real*8 eps
      common /optiparm_l/
     &                    nondimcontrol
      logical nondimcontrol
      common /optiparm_c/
     &                    copt
      character*( 3) copt
      INTEGER myThid
      integer bi,bj
      integer i,j,k
      integer itlo,ithi
      integer jtlo,jthi
      integer jmin,jmax
      integer imin,imax
      integer il
      logical equal
      logical doglobalread
      logical ladinit
      character*( 80)   fnametauu
      character*( 80)   fnametauv
      character*( 80)   fnamesflux
      character*( 80)   fnamehflux
      character*( 80)   fnamesss
      character*( 80)   fnamesst
cHFLUXM_CONTROL
      character*( 80)   fnamehfluxm
cHFLUXM_CONTROL
      integer  ilnblnk
      external ilnblnk
      jtlo = mybylo(mythid)
      jthi = mybyhi(mythid)
      itlo = mybxlo(mythid)
      ithi = mybxhi(mythid)
      jmin = 1
      jmax = sny
      imin = 1
      imax = snx
      doglobalread = .false.
      ladinit      = .false.
      il=ilnblnk( xx_hfluxm_file )
      write(fnamehfluxm(1:80),'(2a,i10.10)')
     &     xx_hfluxm_file(1:il),'.',optimcycle
      call active_read_xy ( fnamehfluxm, tmpfld2d, 1,
     &                      doglobalread, ladinit, optimcycle,
     &                      mythid, xx_hfluxm_dummy )
      do bj = jtlo,jthi
        do bi = itlo,ithi
          do j = jmin,jmax
            do i = imin,imax
              Qnetm(i,j,bi,bj) = Qnetm(i,j,bi,bj) + tmpfld2d(i,j,bi,bj)
            enddo
          enddo
        enddo
      enddo
       CALL EXCH_XY_RS ( Qnetm,  myThid  )
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      subroutine ctrl_smooth (
     U     fld ,mask)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
      integer k, bi, bj
      integer itlo,ithi
      integer jtlo,jthi
      Real*8 fld( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy ,nSx,nSy)
      Real*8 mask( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy,nr,nSx,nSy )
      integer i, j, im1, ip1, jm1, jp1
      Real*8 tempVar
      Real*8 fld_tmp( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
      integer   imin      , imax          , jmin      , jmax
      parameter(imin=2-OLx, imax=sNx+OLx-1, jmin=2-OLy, jmax=sNy+OLy-1)
      Real*8        p0    , p5    , p25     , p125      , p0625
      parameter( p0=0.0, p5=0.5, p25=0.25, p125=0.125, p0625=0.0625 )
      jtlo = 1
      jthi = nsy
      itlo = 1
      ithi = nsx
      k=1
      do bj = jtlo,jthi
         do bi = itlo,ithi
            DO j = jmin, jmax
         jm1 = j-1
         jp1 = j+1
         DO i = imin, imax
            im1 = i-1
            ip1 = i+1
            tempVar =
     &           p25   *   mask(i  ,j  ,k,bi,bj)   +
     &           p125  * ( mask(im1,j  ,k,bi,bj)   +
     &                     mask(ip1,j  ,k,bi,bj)   +
     &                     mask(i  ,jm1,k,bi,bj)   +
     &                     mask(i  ,jp1,k,bi,bj) ) +
     &           p0625 * ( mask(im1,jm1,k,bi,bj)   +
     &                     mask(im1,jp1,k,bi,bj)   +
     &                     mask(ip1,jm1,k,bi,bj)   +
     &                     mask(ip1,jp1,k,bi,bj) )
            IF ( tempVar .GE. p25 ) THEN
               fld_tmp(i,j) = (
     &              p25  * fld(i  ,j,bi,bj  )*mask(i  ,j  ,k,bi,bj) +
     &              p125 *(fld(im1,j ,bi,bj )*mask(im1,j  ,k,bi,bj) +
     &                     fld(ip1,j ,bi,bj )*mask(ip1,j  ,k,bi,bj) +
     &                     fld(i  ,jm1,bi,bj)*mask(i  ,jm1,k,bi,bj) +
     &                     fld(i  ,jp1,bi,bj)*mask(i  ,jp1,k,bi,bj))+
     &              p0625*(fld(im1,jm1,bi,bj)*mask(im1,jm1,k,bi,bj) +
     &                     fld(im1,jp1,bi,bj)*mask(im1,jp1,k,bi,bj) +
     &                     fld(ip1,jm1,bi,bj)*mask(ip1,jm1,k,bi,bj) +
     &                     fld(ip1,jp1,bi,bj)*mask(ip1,jp1,k,bi,bj)))
     &              / tempVar
            ELSE
               fld_tmp(i,j) = fld(i,j,bi,bj)
            ENDIF
         ENDDO
      ENDDO
      DO j = jmin, jmax
         DO i = imin, imax
            fld(i,j,bi,bj) = fld_tmp(i,j)
         ENDDO
      ENDDO
         ENDDO
      ENDDO
      return
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine ctrl_getobcse(
     I                             mytime,
     I                             myiter,
     I                             mythid
     &                           )
c
c
c
      implicit none
      Real*8     mytime
      integer myiter
      integer mythid
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine ctrl_getobcsn(
     I                             mytime,
     I                             myiter,
     I                             mythid
     &                           )
c
c
c
      implicit none
      Real*8     mytime
      integer myiter
      integer mythid
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine ctrl_getobcss(
     I                             mytime,
     I                             myiter,
     I                             mythid
     &                           )
c
c
c
c
      implicit none
      Real*8     mytime
      integer myiter
      integer mythid
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine ctrl_getobcsw(
     I                             mytime,
     I                             myiter,
     I                             mythid
     &                           )
c
c
c
      implicit none
      Real*8     mytime
      integer myiter
      integer mythid
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine ctrl_obcsbal(
     I                       mytime,
     I                       myiter,
     I                       mythid
     &                     )
c
c
      implicit none
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
c
c
      common /ctrl_dummy/
     &                    xx_theta_dummy
     &                  , xx_salt_dummy
     &                  , xx_hflux_dummy
     &                  , xx_sflux_dummy
     &                  , xx_tauu_dummy
     &                  , xx_tauv_dummy
     &                  , xx_atemp_dummy
     &                  , xx_aqh_dummy
     &                  , xx_precip_dummy
     &                  , xx_swflux_dummy
     &                  , xx_swdown_dummy
     &                  , xx_snowprecip_dummy
     &                  , xx_lwflux_dummy
     &                  , xx_lwdown_dummy
     &                  , xx_evap_dummy
     &                  , xx_apressure_dummy
     &                  , xx_runoff_dummy
     &                  , xx_uwind_dummy
     &                  , xx_vwind_dummy
     &                  , xx_obcsn_dummy
     &                  , xx_obcss_dummy
     &                  , xx_obcsw_dummy
     &                  , xx_obcse_dummy
     &                  , xx_diffkr_dummy
     &                  , xx_kapgm_dummy
     &                  , xx_kapredi_dummy
     &                  , xx_tr1_dummy
     &                  , xx_sst_dummy
     &                  , xx_sss_dummy
     &                  , xx_depth_dummy
     &                  , xx_efluxy_dummy
     &                  , xx_efluxp_dummy
     &                  , xx_bottomdrag_dummy
     &                  , xx_edtaux_dummy
     &                  , xx_edtauy_dummy
     &                  , xx_uvel_dummy
     &                  , xx_vvel_dummy
     &                  , xx_etan_dummy
     &                  , xx_siarea_dummy
     &                  , xx_siheff_dummy
     &                  , xx_sihsnow_dummy
     &                  , xx_relaxsst_dummy
     &                  , xx_relaxsss_dummy
     &                  , xx_tbar_mean_dummy
     &                  , xx_tbar_daily_mean_dummy
     &                  , xx_sbar_mean_dummy
     &                  , xx_sbar_daily_mean_dummy
     &                  , xx_ubar_mean_dummy
     &                  , xx_vbar_mean_dummy
     &                  , xx_wbar_mean_dummy
     &                  , xx_psbar_mean_dummy
     &                  , xx_bpbar_mean_dummy
     &                  , xx_taux_mean_dummy
     &                  , xx_tauy_mean_dummy
     &                  , xx_hflux_mean_dummy
     &                  , xx_sflux_mean_dummy
     &                  , xx_sstbar_mean_dummy
     &                  , xx_sssbar_mean_dummy
     &                  , xx_atemp_mean_dummy
     &                  , xx_aqh_mean_dummy
     &                  , xx_precip_mean_dummy
     &                  , xx_swflux_mean_dummy
     &                  , xx_swdown_mean_dummy
     &                  , xx_snowprecip_mean_dummy
     &                  , xx_lwflux_mean_dummy
     &                  , xx_lwdown_mean_dummy
     &                  , xx_evap_mean_dummy
     &                  , xx_apressure_mean_dummy
     &                  , xx_runoff_mean_dummy
     &                  , xx_uwind_mean_dummy
     &                  , xx_vwind_mean_dummy
     &                  , xx_theta_ini_fin_dummy
     &                  , xx_salt_ini_fin_dummy
     &                  , xx_smrareabar_mean_dummy
     &                  , xx_smrsstbar_mean_dummy
     &                  , xx_smrsssbar_mean_dummy
     &                  , xx_gen2d_dummy
     &                  , xx_gen3d_dummy
cHFLUXM_CONTROL
     &                  , xx_hfluxm_dummy
cHFLUXM_CONTROL
      Real*8 xx_theta_dummy
      Real*8 xx_salt_dummy
      Real*8 xx_hflux_dummy
      Real*8 xx_sflux_dummy
      Real*8 xx_tauu_dummy
      Real*8 xx_tauv_dummy
      Real*8 xx_atemp_dummy
      Real*8 xx_aqh_dummy
      Real*8 xx_precip_dummy
      Real*8 xx_swflux_dummy
      Real*8 xx_swdown_dummy
      Real*8 xx_snowprecip_dummy
      Real*8 xx_lwflux_dummy
      Real*8 xx_lwdown_dummy
      Real*8 xx_evap_dummy
      Real*8 xx_apressure_dummy
      Real*8 xx_runoff_dummy
      Real*8 xx_uwind_dummy
      Real*8 xx_vwind_dummy
      Real*8 xx_obcsn_dummy
      Real*8 xx_obcss_dummy
      Real*8 xx_obcsw_dummy
      Real*8 xx_obcse_dummy
      Real*8 xx_diffkr_dummy
      Real*8 xx_kapgm_dummy
      Real*8 xx_kapredi_dummy
      Real*8 xx_tr1_dummy
      Real*8 xx_sst_dummy
      Real*8 xx_sss_dummy
      Real*8 xx_depth_dummy
      Real*8 xx_efluxy_dummy
      Real*8 xx_efluxp_dummy
      Real*8 xx_bottomdrag_dummy
      Real*8 xx_edtaux_dummy
      Real*8 xx_edtauy_dummy
      Real*8 xx_uvel_dummy
      Real*8 xx_vvel_dummy
      Real*8 xx_etan_dummy
      Real*8 xx_siarea_dummy
      Real*8 xx_siheff_dummy
      Real*8 xx_sihsnow_dummy
      Real*8 xx_relaxsst_dummy
      Real*8 xx_relaxsss_dummy
      Real*8 xx_gen2d_dummy
      Real*8 xx_gen3d_dummy
c
      Real*8 xx_tbar_mean_dummy
      Real*8 xx_tbar_daily_mean_dummy
      Real*8 xx_sbar_mean_dummy
      Real*8 xx_sbar_daily_mean_dummy
      Real*8 xx_ubar_mean_dummy
      Real*8 xx_vbar_mean_dummy
      Real*8 xx_wbar_mean_dummy
      Real*8 xx_psbar_mean_dummy
      Real*8 xx_bpbar_mean_dummy
      Real*8 xx_hflux_mean_dummy
      Real*8 xx_sflux_mean_dummy
      Real*8 xx_sstbar_mean_dummy
      Real*8 xx_sssbar_mean_dummy
      Real*8 xx_taux_mean_dummy
      Real*8 xx_tauy_mean_dummy
      Real*8 xx_atemp_mean_dummy
      Real*8 xx_aqh_mean_dummy
      Real*8 xx_precip_mean_dummy
      Real*8 xx_swflux_mean_dummy
      Real*8 xx_swdown_mean_dummy
      Real*8 xx_snowprecip_mean_dummy
      Real*8 xx_lwflux_mean_dummy
      Real*8 xx_lwdown_mean_dummy
      Real*8 xx_evap_mean_dummy
      Real*8 xx_apressure_mean_dummy
      Real*8 xx_runoff_mean_dummy
      Real*8 xx_uwind_mean_dummy
      Real*8 xx_vwind_mean_dummy
      Real*8 xx_theta_ini_fin_dummy
      Real*8 xx_salt_ini_fin_dummy
      Real*8 xx_smrareabar_mean_dummy
      Real*8 xx_smrsstbar_mean_dummy
      Real*8 xx_smrsssbar_mean_dummy
cHFLUXM_CONTROL
      Real*8 xx_hfluxm_dummy
cHFLUXM_CONTROL
      integer myiter
      Real*8     mytime
      integer mythid
      return
      end
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine ctrl_init_obcs_variables( mythid )
c
c
c
      implicit none
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
      integer mythid
      integer bi,bj
      integer i,j,k
      integer itlo,ithi
      integer jtlo,jthi
      integer jmin,jmax
      integer imin,imax
      integer ntmp
      integer ivarindex
      integer iobcs
      jtlo = mybylo(mythid)
      jthi = mybyhi(mythid)
      itlo = mybxlo(mythid)
      ithi = mybxhi(mythid)
      jmin = 1-oly
      jmax = sny+oly
      imin = 1-olx
      imax = snx+olx
 
      return
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine ctrl_GetRec(
     I                        thefield,
     O                        fac,
     O                        first,
     O                        changed,
     O                        count0,
     O                        count1,
     I                        mytime,
     I                        myiter,
     I                        mythid
     &                      )
c
c
c
c
c
c
c
      implicit none
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
      character*(*) thefield
      Real*8     fac
      logical first
      logical changed
      integer count0
      integer count1
      Real*8     mytime
      integer myiter
      integer mythid
      return
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      subroutine ctrl_volflux(
     I                       obcsncount,
     O                       sumarea,
     O                       sumflux, mythid
     &                     )
c
c
      implicit none
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
c
c
      common /ctrl_dummy/
     &                    xx_theta_dummy
     &                  , xx_salt_dummy
     &                  , xx_hflux_dummy
     &                  , xx_sflux_dummy
     &                  , xx_tauu_dummy
     &                  , xx_tauv_dummy
     &                  , xx_atemp_dummy
     &                  , xx_aqh_dummy
     &                  , xx_precip_dummy
     &                  , xx_swflux_dummy
     &                  , xx_swdown_dummy
     &                  , xx_snowprecip_dummy
     &                  , xx_lwflux_dummy
     &                  , xx_lwdown_dummy
     &                  , xx_evap_dummy
     &                  , xx_apressure_dummy
     &                  , xx_runoff_dummy
     &                  , xx_uwind_dummy
     &                  , xx_vwind_dummy
     &                  , xx_obcsn_dummy
     &                  , xx_obcss_dummy
     &                  , xx_obcsw_dummy
     &                  , xx_obcse_dummy
     &                  , xx_diffkr_dummy
     &                  , xx_kapgm_dummy
     &                  , xx_kapredi_dummy
     &                  , xx_tr1_dummy
     &                  , xx_sst_dummy
     &                  , xx_sss_dummy
     &                  , xx_depth_dummy
     &                  , xx_efluxy_dummy
     &                  , xx_efluxp_dummy
     &                  , xx_bottomdrag_dummy
     &                  , xx_edtaux_dummy
     &                  , xx_edtauy_dummy
     &                  , xx_uvel_dummy
     &                  , xx_vvel_dummy
     &                  , xx_etan_dummy
     &                  , xx_siarea_dummy
     &                  , xx_siheff_dummy
     &                  , xx_sihsnow_dummy
     &                  , xx_relaxsst_dummy
     &                  , xx_relaxsss_dummy
     &                  , xx_tbar_mean_dummy
     &                  , xx_tbar_daily_mean_dummy
     &                  , xx_sbar_mean_dummy
     &                  , xx_sbar_daily_mean_dummy
     &                  , xx_ubar_mean_dummy
     &                  , xx_vbar_mean_dummy
     &                  , xx_wbar_mean_dummy
     &                  , xx_psbar_mean_dummy
     &                  , xx_bpbar_mean_dummy
     &                  , xx_taux_mean_dummy
     &                  , xx_tauy_mean_dummy
     &                  , xx_hflux_mean_dummy
     &                  , xx_sflux_mean_dummy
     &                  , xx_sstbar_mean_dummy
     &                  , xx_sssbar_mean_dummy
     &                  , xx_atemp_mean_dummy
     &                  , xx_aqh_mean_dummy
     &                  , xx_precip_mean_dummy
     &                  , xx_swflux_mean_dummy
     &                  , xx_swdown_mean_dummy
     &                  , xx_snowprecip_mean_dummy
     &                  , xx_lwflux_mean_dummy
     &                  , xx_lwdown_mean_dummy
     &                  , xx_evap_mean_dummy
     &                  , xx_apressure_mean_dummy
     &                  , xx_runoff_mean_dummy
     &                  , xx_uwind_mean_dummy
     &                  , xx_vwind_mean_dummy
     &                  , xx_theta_ini_fin_dummy
     &                  , xx_salt_ini_fin_dummy
     &                  , xx_smrareabar_mean_dummy
     &                  , xx_smrsstbar_mean_dummy
     &                  , xx_smrsssbar_mean_dummy
     &                  , xx_gen2d_dummy
     &                  , xx_gen3d_dummy
cHFLUXM_CONTROL
     &                  , xx_hfluxm_dummy
cHFLUXM_CONTROL
      Real*8 xx_theta_dummy
      Real*8 xx_salt_dummy
      Real*8 xx_hflux_dummy
      Real*8 xx_sflux_dummy
      Real*8 xx_tauu_dummy
      Real*8 xx_tauv_dummy
      Real*8 xx_atemp_dummy
      Real*8 xx_aqh_dummy
      Real*8 xx_precip_dummy
      Real*8 xx_swflux_dummy
      Real*8 xx_swdown_dummy
      Real*8 xx_snowprecip_dummy
      Real*8 xx_lwflux_dummy
      Real*8 xx_lwdown_dummy
      Real*8 xx_evap_dummy
      Real*8 xx_apressure_dummy
      Real*8 xx_runoff_dummy
      Real*8 xx_uwind_dummy
      Real*8 xx_vwind_dummy
      Real*8 xx_obcsn_dummy
      Real*8 xx_obcss_dummy
      Real*8 xx_obcsw_dummy
      Real*8 xx_obcse_dummy
      Real*8 xx_diffkr_dummy
      Real*8 xx_kapgm_dummy
      Real*8 xx_kapredi_dummy
      Real*8 xx_tr1_dummy
      Real*8 xx_sst_dummy
      Real*8 xx_sss_dummy
      Real*8 xx_depth_dummy
      Real*8 xx_efluxy_dummy
      Real*8 xx_efluxp_dummy
      Real*8 xx_bottomdrag_dummy
      Real*8 xx_edtaux_dummy
      Real*8 xx_edtauy_dummy
      Real*8 xx_uvel_dummy
      Real*8 xx_vvel_dummy
      Real*8 xx_etan_dummy
      Real*8 xx_siarea_dummy
      Real*8 xx_siheff_dummy
      Real*8 xx_sihsnow_dummy
      Real*8 xx_relaxsst_dummy
      Real*8 xx_relaxsss_dummy
      Real*8 xx_gen2d_dummy
      Real*8 xx_gen3d_dummy
c
      Real*8 xx_tbar_mean_dummy
      Real*8 xx_tbar_daily_mean_dummy
      Real*8 xx_sbar_mean_dummy
      Real*8 xx_sbar_daily_mean_dummy
      Real*8 xx_ubar_mean_dummy
      Real*8 xx_vbar_mean_dummy
      Real*8 xx_wbar_mean_dummy
      Real*8 xx_psbar_mean_dummy
      Real*8 xx_bpbar_mean_dummy
      Real*8 xx_hflux_mean_dummy
      Real*8 xx_sflux_mean_dummy
      Real*8 xx_sstbar_mean_dummy
      Real*8 xx_sssbar_mean_dummy
      Real*8 xx_taux_mean_dummy
      Real*8 xx_tauy_mean_dummy
      Real*8 xx_atemp_mean_dummy
      Real*8 xx_aqh_mean_dummy
      Real*8 xx_precip_mean_dummy
      Real*8 xx_swflux_mean_dummy
      Real*8 xx_swdown_mean_dummy
      Real*8 xx_snowprecip_mean_dummy
      Real*8 xx_lwflux_mean_dummy
      Real*8 xx_lwdown_mean_dummy
      Real*8 xx_evap_mean_dummy
      Real*8 xx_apressure_mean_dummy
      Real*8 xx_runoff_mean_dummy
      Real*8 xx_uwind_mean_dummy
      Real*8 xx_vwind_mean_dummy
      Real*8 xx_theta_ini_fin_dummy
      Real*8 xx_salt_ini_fin_dummy
      Real*8 xx_smrareabar_mean_dummy
      Real*8 xx_smrsstbar_mean_dummy
      Real*8 xx_smrsssbar_mean_dummy
cHFLUXM_CONTROL
      Real*8 xx_hfluxm_dummy
cHFLUXM_CONTROL
c
c
c
c
c
c
c
c
c
      character*(5)  lsoptversion
      parameter    ( lsoptversion = '2.1.0' )
      character*(5)  offlineversion
      parameter    ( offlineversion = '0.1.1' )
c
c
      common /optiparm_i/
     &                    optimcycle,
     &                    nvars,
     &                    numiter,
     &                    nfunc,
     &                    iprint,
     &                    nupdate
      integer optimcycle
      integer nvars
      integer numiter
      integer nfunc
      integer iprint
      integer nupdate
      common /optiparm_r/
     &                    fmin,
     &                    epsf,
     &                    epsx,
     &                    epsg,
     &                    eps
      Real*8 epsf
      Real*8 epsx
      Real*8 fmin
      Real*8 epsg
      Real*8 eps
      common /optiparm_l/
     &                    nondimcontrol
      logical nondimcontrol
      common /optiparm_c/
     &                    copt
      character*( 3) copt
      integer obcsncount
      Real*8 sumflux
      Real*8 sumarea
      integer mythid
      return
      end
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_ADVECTION(
     I     implicitAdvection, advectionScheme, vertAdvecScheme,
     I     tracerIdentity, deltaTLev,
     I     uVel, vVel, wVel, tracer,
     O     gTracer,
     I     bi,bj, myTime,myIter,myThid)
C
C
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      LOGICAL implicitAdvection
      INTEGER advectionScheme, vertAdvecScheme
      INTEGER tracerIdentity
      Real*8 deltaTLev(Nr)
      Real*8 uVel  (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      Real*8 vVel  (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      Real*8 wVel  (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      Real*8 tracer(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      INTEGER bi,bj
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      Real*8 gTracer(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      Real*8 maskLocW(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 maskLocS(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER iMinUpd,iMaxUpd,jMinUpd,jMaxUpd
      INTEGER i,j,k,kUp,kDown
      Real*8 xA      (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 yA      (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uFld    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 wFld    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uTrans  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vTrans  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rTrans  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rTransKp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 af      (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 afx     (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 afy     (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 fVerT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
      Real*8 localTij(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 localTijk(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 kp1Msk
      LOGICAL calc_fluxes_X, calc_fluxes_Y, withSigns
      LOGICAL interiorOnly, overlapOnly
      INTEGER npass, ipass
      INTEGER nCFace
      LOGICAL N_edge, S_edge, E_edge, W_edge
          act0 = tracerIdentity
          max0 = maxpass
          act1 = bi - myBxLo(myThid)
          max1 = myBxHi(myThid) - myBxLo(myThid) + 1
          act2 = bj - myByLo(myThid)
          max2 = myByHi(myThid) - myByLo(myThid) + 1
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = ikey_dynamics - 1
          igadkey = act0
     &                      + act1*max0
     &                      + act2*max0*max1
     &                      + act3*max0*max1*max2
     &                      + act4*max0*max1*max2*max3
          IF (tracerIdentity.GT.maxpass) THEN
             print *, 'ph-pass gad_advection ', maxpass, tracerIdentity
             STOP 'maxpass seems smaller than tracerIdentity'
          ENDIF
      DO j=1-OLy,sNy+OLy
       DO i=1-OLx,sNx+OLx
        xA(i,j)      = 0.d0
        yA(i,j)      = 0.d0
        uTrans(i,j)  = 0.d0
        vTrans(i,j)  = 0.d0
        rTrans(i,j)  = 0.d0
        fVerT(i,j,1) = 0.d0
        fVerT(i,j,2) = 0.d0
        rTransKp1(i,j)= 0.d0
        localTij(i,j) = 0.d0
        wfld(i,j)    = 0.d0
       ENDDO
      ENDDO
      IF (useCubedSphereExchange) THEN
       npass  = 3
       IF ( npass.GT.maxcube ) STOP 'maxcube needs to be = 3'
       nCFace = bi
       N_edge = .TRUE.
       S_edge = .TRUE.
       E_edge = .TRUE.
       W_edge = .TRUE.
      ELSE
       npass  = 2
       nCFace = 0
       N_edge = .FALSE.
       S_edge = .FALSE.
       E_edge = .FALSE.
       W_edge = .FALSE.
      ENDIF
      DO k=1,Nr
         kkey = (igadkey-1)*Nr + k
CADJ STORE tracer(:,:,k,bi,bj) =
CADJ &     comlev1_bibj_k_gad, key=kkey, kind=isbyte
      CALL CALC_COMMON_FACTORS (
     I         uVel, vVel,
     O         uFld, vFld, uTrans, vTrans, xA, yA,
     I         k,bi,bj, myThid )
      IF (useGMRedi)
     &   CALL GMREDI_CALC_UVFLOW(
     U                  uFld, vFld, uTrans, vTrans,
     I                  k, bi, bj, myThid )
      DO j=1-OLy,sNy+OLy
       DO i=1-OLx,sNx+OLx
         localTij(i,j)=tracer(i,j,k,bi,bj)
         maskLocW(i,j)=maskW(i,j,k,bi,bj)
         maskLocS(i,j)=maskS(i,j,k,bi,bj)
       ENDDO
      ENDDO
      IF (useCubedSphereExchange) THEN
        withSigns = .FALSE.
        CALL FILL_CS_CORNER_UV_RS(
     &            withSigns, maskLocW,maskLocS, bi,bj, myThid )
      ENDIF
      DO ipass=1,npass
         passkey = ipass
     &                   + (k-1)      *maxpass
     &                   + (igadkey-1)*maxpass*Nr
         IF (npass .GT. maxpass) THEN
          STOP 'GAD_ADVECTION: npass > maxcube. check tamc.h'
         ENDIF
      interiorOnly = .FALSE.
      overlapOnly  = .FALSE.
      IF (useCubedSphereExchange) THEN
       IF (ipass.EQ.1) THEN
        overlapOnly  = MOD(nCFace,3).EQ.0
        interiorOnly = MOD(nCFace,3).NE.0
        calc_fluxes_X = nCFace.EQ.6 .OR. nCFace.EQ.1 .OR. nCFace.EQ.2
        calc_fluxes_Y = nCFace.EQ.3 .OR. nCFace.EQ.4 .OR. nCFace.EQ.5
       ELSEIF (ipass.EQ.2) THEN
        overlapOnly  = MOD(nCFace,3).EQ.2
        interiorOnly = MOD(nCFace,3).EQ.1
        calc_fluxes_X = nCFace.EQ.2 .OR. nCFace.EQ.3 .OR. nCFace.EQ.4
        calc_fluxes_Y = nCFace.EQ.5 .OR. nCFace.EQ.6 .OR. nCFace.EQ.1
       ELSE
        interiorOnly = .TRUE.
        calc_fluxes_X = nCFace.EQ.5 .OR. nCFace.EQ.6
        calc_fluxes_Y = nCFace.EQ.2 .OR. nCFace.EQ.3
       ENDIF
      ELSE
        calc_fluxes_X = MOD(ipass,2).EQ.1
        calc_fluxes_Y = .NOT.calc_fluxes_X
      ENDIF
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          af(i,j) = 0.
         ENDDO
        ENDDO
C
CADJ STORE localTij(:,:)  =
CADJ &     comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte
CADJ STORE af(:,:)  =
CADJ &     comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte
C
      IF (calc_fluxes_X) THEN
       IF ( .NOT.overlapOnly .OR. N_edge .OR. S_edge ) THEN
        IF ( overlapOnly ) THEN
         CALL FILL_CS_CORNER_TR_RL( 1, .FALSE.,
     &                              localTij, bi,bj, myThid )
        ENDIF
CADJ STORE localTij(:,:)  =
CADJ &     comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte
        IF ( advectionScheme.EQ.ENUM_UPWIND_1RST
     &     .OR. advectionScheme.EQ.ENUM_DST2 ) THEN
          CALL GAD_DST2U1_ADV_X( bi,bj,k, advectionScheme, .TRUE.,
     I                           deltaTLev(k),uTrans,uFld,localTij,
     O                           af, myThid )
        ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN
          CALL GAD_FLUXLIMIT_ADV_X( bi,bj,k, .TRUE., deltaTLev(k),
     I                              uTrans, uFld, maskLocW, localTij,
     O                              af, myThid )
        ELSEIF (advectionScheme.EQ.ENUM_DST3 ) THEN
          CALL GAD_DST3_ADV_X(      bi,bj,k, .TRUE., deltaTLev(k),
     I                              uTrans, uFld, maskLocW, localTij,
     O                              af, myThid )
        ELSEIF (advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
          CALL GAD_DST3FL_ADV_X(    bi,bj,k, .TRUE., deltaTLev(k),
     I                              uTrans, uFld, maskLocW, localTij,
     O                              af, myThid )
        ELSE
         STOP 'GAD_ADVECTION: adv. scheme incompatibale with multi-dim'
        ENDIF
        IF ( overlapOnly .AND. ipass.EQ.1 ) THEN
         CALL FILL_CS_CORNER_TR_RL( 2, .FALSE.,
     &                              localTij, bi,bj, myThid )
        ENDIF
       ENDIF
       IF ( overlapOnly ) THEN
        iMinUpd = 1-Olx+1
        iMaxUpd = sNx+Olx-1
        IF ( W_edge ) iMinUpd = 1
        IF ( E_edge ) iMaxUpd = sNx
        IF ( S_edge ) THEN
         DO j=1-Oly,0
          DO i=iMinUpd,iMaxUpd
           localTij(i,j) = localTij(i,j)
     &      -deltaTLev(k)*recip_rhoFacC(k)
     &       *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
     &       *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)
     &       *( af(i+1,j)-af(i,j)
     &         -tracer(i,j,k,bi,bj)*(uTrans(i+1,j)-uTrans(i,j))
     &        )
          ENDDO
         ENDDO
        ENDIF
        IF ( N_edge ) THEN
         DO j=sNy+1,sNy+Oly
          DO i=iMinUpd,iMaxUpd
           localTij(i,j) = localTij(i,j)
     &      -deltaTLev(k)*recip_rhoFacC(k)
     &       *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
     &       *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)
     &       *( af(i+1,j)-af(i,j)
     &         -tracer(i,j,k,bi,bj)*(uTrans(i+1,j)-uTrans(i,j))
     &        )
          ENDDO
         ENDDO
        ENDIF
       ELSE
        jMinUpd = 1-Oly
        jMaxUpd = sNy+Oly
        IF ( interiorOnly .AND. S_edge ) jMinUpd = 1
        IF ( interiorOnly .AND. N_edge ) jMaxUpd = sNy
        DO j=jMinUpd,jMaxUpd
         DO i=1-Olx+1,sNx+Olx-1
           localTij(i,j) = localTij(i,j)
     &      -deltaTLev(k)*recip_rhoFacC(k)
     &       *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
     &       *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)
     &       *( af(i+1,j)-af(i,j)
     &         -tracer(i,j,k,bi,bj)*(uTrans(i+1,j)-uTrans(i,j))
     &        )
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          afx(i,j) = af(i,j)
         ENDDO
        ENDDO
       ENDIF
      ENDIF
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          af(i,j) = 0.
         ENDDO
        ENDDO
C
CADJ STORE localTij(:,:)  =
CADJ &     comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte
CADJ STORE af(:,:)  =
CADJ &     comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte
C
      IF (calc_fluxes_Y) THEN
       IF ( .NOT.overlapOnly .OR. E_edge .OR. W_edge ) THEN
        IF ( overlapOnly ) THEN
         CALL FILL_CS_CORNER_TR_RL( 2, .FALSE.,
     &                              localTij, bi,bj, myThid )
        ENDIF
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          af(i,j) = 0.
         ENDDO
        ENDDO
CADJ STORE localTij(:,:)  =
CADJ &     comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte
        IF ( advectionScheme.EQ.ENUM_UPWIND_1RST
     &     .OR. advectionScheme.EQ.ENUM_DST2 ) THEN
          CALL GAD_DST2U1_ADV_Y( bi,bj,k, advectionScheme, .TRUE.,
     I                           deltaTLev(k),vTrans,vFld,localTij,
     O                           af, myThid )
        ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN
          CALL GAD_FLUXLIMIT_ADV_Y( bi,bj,k, .TRUE., deltaTLev(k),
     I                              vTrans, vFld, maskLocS, localTij,
     O                              af, myThid )
        ELSEIF (advectionScheme.EQ.ENUM_DST3 ) THEN
          CALL GAD_DST3_ADV_Y(      bi,bj,k, .TRUE., deltaTLev(k),
     I                              vTrans, vFld, maskLocS, localTij,
     O                              af, myThid )
        ELSEIF (advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
          CALL GAD_DST3FL_ADV_Y(    bi,bj,k, .TRUE., deltaTLev(k),
     I                              vTrans, vFld, maskLocS, localTij,
     O                              af, myThid )
        ELSE
         STOP 'GAD_ADVECTION: adv. scheme incompatibale with mutli-dim'
        ENDIF
        IF ( overlapOnly .AND. ipass.EQ.1 ) THEN
         CALL FILL_CS_CORNER_TR_RL( 1, .FALSE.,
     &                              localTij, bi,bj, myThid )
        ENDIF
       ENDIF
       IF ( overlapOnly ) THEN
        jMinUpd = 1-Oly+1
        jMaxUpd = sNy+Oly-1
        IF ( S_edge ) jMinUpd = 1
        IF ( N_edge ) jMaxUpd = sNy
        IF ( W_edge ) THEN
         DO j=jMinUpd,jMaxUpd
          DO i=1-Olx,0
           localTij(i,j) = localTij(i,j)
     &      -deltaTLev(k)*recip_rhoFacC(k)
     &       *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
     &       *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)
     &       *( af(i,j+1)-af(i,j)
     &         -tracer(i,j,k,bi,bj)*(vTrans(i,j+1)-vTrans(i,j))
     &        )
          ENDDO
         ENDDO
        ENDIF
        IF ( E_edge ) THEN
         DO j=jMinUpd,jMaxUpd
          DO i=sNx+1,sNx+Olx
           localTij(i,j) = localTij(i,j)
     &      -deltaTLev(k)*recip_rhoFacC(k)
     &       *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
     &       *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)
     &       *( af(i,j+1)-af(i,j)
     &         -tracer(i,j,k,bi,bj)*(vTrans(i,j+1)-vTrans(i,j))
     &        )
          ENDDO
         ENDDO
        ENDIF
       ELSE
        iMinUpd = 1-Olx
        iMaxUpd = sNx+Olx
        IF ( interiorOnly .AND. W_edge ) iMinUpd = 1
        IF ( interiorOnly .AND. E_edge ) iMaxUpd = sNx
        DO j=1-Oly+1,sNy+Oly-1
         DO i=iMinUpd,iMaxUpd
           localTij(i,j) = localTij(i,j)
     &      -deltaTLev(k)*recip_rhoFacC(k)
     &       *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
     &       *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)
     &       *( af(i,j+1)-af(i,j)
     &         -tracer(i,j,k,bi,bj)*(vTrans(i,j+1)-vTrans(i,j))
     &        )
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          afy(i,j) = af(i,j)
         ENDDO
        ENDDO
       ENDIF
      ENDIF
      ENDDO
      IF ( implicitAdvection ) THEN
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          gTracer(i,j,k,bi,bj)=
     &     (localTij(i,j)-tracer(i,j,k,bi,bj))/deltaTLev(k)
         ENDDO
        ENDDO
      ELSE
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          localTijk(i,j,k)=localTij(i,j)
         ENDDO
        ENDDO
      ENDIF
      IF ( debugLevel .GE. debLevB
     &   .AND. tracerIdentity.EQ.GAD_TEMPERATURE
     &   .AND. k.LE.3 .AND. myIter.EQ.1+nIter0
     &   .AND. nPx.EQ.1 .AND. nPy.EQ.1
     &   .AND. useCubedSphereExchange ) THEN
        CALL DEBUG_CS_CORNER_UV( ' afx,afy from GAD_ADVECTION',
     &             afx,afy, k, standardMessageUnit,bi,bj,myThid )
      ENDIF
      ENDDO
      IF ( .NOT.implicitAdvection ) THEN
       DO k=Nr,1,-1
         kkey = (igadkey-1)*Nr + (Nr-k+1)
        kUp  = 1+MOD(k+1,2)
        kDown= 1+MOD(k,2)
        kp1Msk=1.
        if (k.EQ.Nr) kp1Msk=0.
CADJ STORE rtrans(:,:)  =
CADJ &     comlev1_bibj_k_gad, key=kkey, kind=isbyte
        IF ( k.EQ.1 ) THEN
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           rTransKp1(i,j) = kp1Msk*rTrans(i,j)
           wFld(i,j)   = 0.
           rTrans(i,j) = 0.
           fVerT(i,j,kUp) = 0.
          ENDDO
         ENDDO
        ELSE
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           rTransKp1(i,j) = kp1Msk*rTrans(i,j)
           wFld(i,j)   = wVel(i,j,k,bi,bj)
           rTrans(i,j) = wVel(i,j,k,bi,bj)*rA(i,j,bi,bj)
     &                 *deepFac2F(k)*rhoFacF(k)
     &                 *maskC(i,j,k-1,bi,bj)
           fVerT(i,j,kUp) = 0.
          ENDDO
         ENDDO
         IF (useGMRedi)
     &     CALL GMREDI_CALC_WFLOW(
     U                 wFld, rTrans,
     I                 k, bi, bj, myThid )
         IF ( vertAdvecScheme.EQ.ENUM_UPWIND_1RST
     &      .OR. vertAdvecScheme.EQ.ENUM_DST2 ) THEN
           CALL GAD_DST2U1_ADV_R( bi,bj,k, advectionScheme,
     I                            deltaTLev(k),rTrans,wFld,localTijk,
     O                            fVerT(1-Olx,1-Oly,kUp), myThid )
         ELSEIF( vertAdvecScheme.EQ.ENUM_FLUX_LIMIT) THEN
           CALL GAD_FLUXLIMIT_ADV_R( bi,bj,k, deltaTLev(k),
     I                               rTrans, wFld, localTijk,
     O                               fVerT(1-Olx,1-Oly,kUp), myThid )
         ELSEIF( vertAdvecScheme.EQ.ENUM_DST3 ) THEN
           CALL GAD_DST3_ADV_R(      bi,bj,k, deltaTLev(k),
     I                               rTrans, wFld, localTijk,
     O                               fVerT(1-Olx,1-Oly,kUp), myThid )
         ELSEIF( vertAdvecScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
           CALL GAD_DST3FL_ADV_R(    bi,bj,k, deltaTLev(k),
     I                               rTrans, wFld, localTijk,
     O                               fVerT(1-Olx,1-Oly,kUp), myThid )
         ELSE
          STOP 'GAD_ADVECTION: adv. scheme incompatibale with mutli-dim'
         ENDIF
        ENDIF
CADJ STORE fVerT(:,:,:)
CADJ &     = comlev1_bibj_k_gad, key=kkey, kind=isbyte
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          localTij(i,j) = localTijk(i,j,k)
     &      -deltaTLev(k)*recip_rhoFacC(k)
     &       *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
     &       *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)
     &       *( fVerT(i,j,kDown)-fVerT(i,j,kUp)
     &         -tracer(i,j,k,bi,bj)*(rTransKp1(i,j)-rTrans(i,j))
     &        )*rkSign
          gTracer(i,j,k,bi,bj)=
     &     (localTij(i,j)-tracer(i,j,k,bi,bj))/deltaTLev(k)
         ENDDO
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_BIHARM_X(
     I           bi,bj,k,
     I           xA,del2T,diffK4,
     U           dfx,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 xA   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 del2T(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 diffK4
      INTEGER myThid
      Real*8 dfx  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx+1,sNx+Olx
         dfx(i,j) = dfx(i,j) + diffK4*xA(i,j)
     &    *recip_dxC(i,j,bi,bj)*recip_deepFacC(k)
     &    *(del2T(i,j)-del2T(i-1,j))
     &    *sqCosFacU(j,bi,bj)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_BIHARM_Y(
     I           bi,bj,k,
     I           yA,del2T,diffK4,
     O           dfy,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 yA   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 del2T(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 diffK4
      INTEGER myThid
      Real*8 dfy  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      DO j=1-Oly+1,sNy+Oly
       DO i=1-Olx,sNx+Olx
         dfy(i,j) = dfy(i,j) + diffK4*yA(i,j)
     &    *recip_dyC(i,j,bi,bj)*recip_deepFacC(k)
     &    *(del2T(i,j)-del2T(i,j-1))
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_C2_ADV_R( 
     I           bi,bj,k,
     I           rTrans,
     I           tracer,
     O           wT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER bi,bj,k
      Real*8 rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      Real*8 wT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j,km1
      km1=max(1,k-1)
      IF ( k.EQ.1 .OR. k.GT.Nr) THEN
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         wT(i,j) = 0.
        ENDDO
       ENDDO
      ELSE
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         wT(i,j) = maskC(i,j,kM1,bi,bj)*
     &     rTrans(i,j)*
     &        (Tracer(i,j,k,bi,bj)+Tracer(i,j,kM1,bi,bj))*0.5d0
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_C2_IMPL_R( 
     I           bi,bj,k, iMin,iMax,jMin,jMax, 
     I           deltaTarg, rTrans,
     O           a3d, b3d, c3d,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER bi,bj,k
      INTEGER iMin,iMax,jMin,jMax
      Real*8 deltaTarg(Nr)
      Real*8 rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 a3d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 b3d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 c3d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      INTEGER myThid
      INTEGER i,j
      Real*8 rCenter
      IF ( k.GT.1 .AND. k.LE.Nr ) THEN
       DO j=jMin,jMax
         DO i=iMin,iMax
           rCenter = 0.5d0 *rTrans(i,j)*recip_rA(i,j,bi,bj)*rkSign
           a3d(i,j,k)   = a3d(i,j,k)
     &                  - rCenter*deltaTarg(k)
     &                   *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
           b3d(i,j,k)   = b3d(i,j,k)
     &                  - rCenter*deltaTarg(k)
     &                   *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
           b3d(i,j,k-1) = b3d(i,j,k-1)
     &                  + rCenter*deltaTarg(k-1)
     &                   *recip_hFacC(i,j,k-1,bi,bj)*recip_drF(k-1)
           c3d(i,j,k-1) = c3d(i,j,k-1)
     &                  + rCenter*deltaTarg(k-1)
     &                   *recip_hFacC(i,j,k-1,bi,bj)*recip_drF(k-1)
         ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_C2_ADV_X( 
     I           bi,bj,k,
     I           uTrans,
     I           tracer,
     O           uT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 uT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      DO j=1-Oly,sNy+Oly
       uT(1-Olx,j)=0.
      ENDDO
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx+1,sNx+Olx
        uT(i,j) = 
     &   uTrans(i,j)*(Tracer(i,j)+Tracer(i-1,j))*0.5d0
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_C2_ADV_Y( 
     I           bi,bj,k,
     I           vTrans,
     I           tracer,
     O           vT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 vT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      DO i=1-Olx,sNx+Olx
       vT(i,1-Oly)=0.
      ENDDO
      DO j=1-Oly+1,sNy+Oly
       DO i=1-Olx,sNx+Olx
        vT(i,j) = 
     &   vTrans(i,j)*(Tracer(i,j)+Tracer(i,j-1))*0.5d0
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_C4_ADV_R( 
     I           bi,bj,k,
     I           rTrans,
     I           tracer,
     O           wT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      Real*8 rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      Real*8 wT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j,kp1,km1,km2
      Real*8 Rjm,Rj,Rjp,Rjjm,Rjjp
      Real*8 maskPM, maskBound
      km2=MAX(1,k-2)
      km1=MAX(1,k-1)
      kp1=MIN(Nr,k+1)
      maskPM = 1.
      IF (k.LE.2 .OR. k.GE.Nr) maskPM = 0.
      IF ( k.EQ.1 .OR. k.GT.Nr) THEN
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         wT(i,j) = 0.
        ENDDO
       ENDDO
      ELSE
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         maskBound = maskPM*maskC(i,j,km2,bi,bj)*maskC(i,j,kp1,bi,bj)
         Rjp=(tracer(i,j,kp1,bi,bj)-tracer(i,j,k,bi,bj))
     &        *maskC(i,j,kp1,bi,bj)
         Rj =(tracer(i,j,k,bi,bj)-tracer(i,j,km1,bi,bj))
         Rjm=(tracer(i,j,km1,bi,bj)-tracer(i,j,km2,bi,bj))
     &        *maskC(i,j,km1,bi,bj)
         Rjjp=(Rjp-Rj)
         Rjjm=(Rj-Rjm)
         wT(i,j) = maskC(i,j,km1,bi,bj)*(
     &     rTrans(i,j)*(
     &        (Tracer(i,j,k,bi,bj)+Tracer(i,j,km1,bi,bj))*0.5d0
     &        -oneSixth*(Rjjm+Rjjp)*0.5d0 )
     &    +ABS(rTrans(i,j))*
     &         oneSixth*(Rjjm-Rjjp)*0.5d0*(1.d0 - maskBound)
     &                                  )                      
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_C4_ADV_X( 
     I           bi,bj,k,
     I           uTrans,
     I           tracer,
     O           uT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      Real*8 uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 uT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      Real*8 Rjm,Rj,Rjp,Rjjm,Rjjp
      DO j=1-Oly,sNy+Oly
       uT(1-Olx,j)=0.
       uT(2-Olx,j)=0.
       uT(sNx+Olx,j)=0.
      ENDDO
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx+2,sNx+Olx-1
        Rjp=(tracer(i+1,j)-tracer(i,j))
     &     *maskW(i+1,j,k,bi,bj)
        Rj =(tracer(i,j)-tracer(i-1,j))
     &     *maskW(i,j,k,bi,bj)
        Rjm=(tracer(i-1,j)-tracer(i-2,j))
     &     *maskW(i-1,j,k,bi,bj)
        Rjjp=(Rjp-Rj)
        Rjjm=(Rj-Rjm)
        uT(i,j) =
     &   uTrans(i,j)*(
     &     Tracer(i,j)+Tracer(i-1,j)-oneSixth*( Rjjp+Rjjm )
     &               )*0.5d0
     &  +ABS( uTrans(i,j) )*0.5d0*oneSixth*( Rjjp-Rjjm )
     &    *( 1.d0 - maskW(i-1,j,k,bi,bj)*maskW(i+1,j,k,bi,bj) )
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_C4_ADV_Y( 
     I           bi,bj,k,
     I           vTrans,
     I           tracer,
     O           vT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      Real*8 vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 vT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      Real*8 Rjm,Rj,Rjp,Rjjm,Rjjp
      DO i=1-Olx,sNx+Olx
       vT(i,1-Oly)=0.
       vT(i,2-Oly)=0.
       vT(i,sNy+Oly)=0.
      ENDDO
      DO j=1-Oly+2,sNy+Oly-1
       DO i=1-Olx,sNx+Olx
        Rjp=(tracer(i,j+1)-tracer(i,j))
     &     *maskS(i,j+1,k,bi,bj)
        Rj =(tracer(i,j)-tracer(i,j-1))
     &     *maskS(i,j,k,bi,bj)
        Rjm=(tracer(i,j-1)-tracer(i,j-2))
     &     *maskS(i,j-1,k,bi,bj)
        Rjjp=(Rjp-Rj)
        Rjjm=(Rj-Rjm)
        vT(i,j) =
     &   vTrans(i,j)*(
     &     Tracer(i,j)+Tracer(i,j-1)-oneSixth*( Rjjp+Rjjm )
     &               )*0.5d0
     &  +ABS( vTrans(i,j) )*0.5d0*oneSixth*( Rjjp-Rjjm )
     &    *( 1.d0 - maskS(i,j-1,k,bi,bj)*maskS(i,j+1,k,bi,bj) )
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_CALC_RHS(
     I           bi,bj,iMin,iMax,jMin,jMax,k,kM1,kUp,kDown,
     I           xA, yA, maskUp, uFld, vFld, wFld,
     I           uTrans, vTrans, rTrans, rTransKp1,
     I           diffKh, diffK4, KappaR, TracerN, TracAB,
     I           deltaTLev, tracerIdentity,
     I           advectionScheme, vertAdvecScheme,
     I           calcAdvection, implicitAdvection, applyAB_onTracer,
     I           trUseGMRedi, trUseKPP,
     U           fVerT, gTracer,
     I           myTime, myIter, myThid )
C
C
C
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      INTEGER bi,bj,iMin,iMax,jMin,jMax
      INTEGER k,kUp,kDown,kM1
      Real*8 xA    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 yA    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 maskUp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 wFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rTransKp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 diffKh, diffK4
      Real*8 KappaR(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 TracerN(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 TracAB (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 deltaTLev(Nr)
      INTEGER tracerIdentity
      INTEGER advectionScheme, vertAdvecScheme
      LOGICAL calcAdvection
      LOGICAL implicitAdvection, applyAB_onTracer
      LOGICAL trUseGMRedi, trUseKPP
      Real*8     myTime
      INTEGER myIter, myThid
      Real*8 gTracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 fVerT (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
      INTEGER i,j
      Real*8 df4   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 fZon  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 fMer  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 af    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 df    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 localT(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 locABT(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 advFac, rAdvFac
      fVerT(1,1,kDown) = fVerT(1,1,kDown)
      advFac  = 0.d0
      IF (calcAdvection) advFac = 1.d0
      rAdvFac = rkSign*advFac
      IF (implicitAdvection) rAdvFac = 0.d0
      DO j=1-OLy,sNy+OLy
       DO i=1-OLx,sNx+OLx
        fZon(i,j)      = 0.d0
        fMer(i,j)      = 0.d0
        fVerT(i,j,kUp) = 0.d0
        df(i,j)        = 0.d0
        df4(i,j)       = 0.d0
       ENDDO
      ENDDO
      IF ( applyAB_onTracer ) THEN
        DO j=1-OLy,sNy+OLy
         DO i=1-OLx,sNx+OLx
          localT(i,j)=TracerN(i,j,k,bi,bj)
          locABT(i,j)= TracAB(i,j,k,bi,bj)
         ENDDO
        ENDDO
      ELSE
        DO j=1-OLy,sNy+OLy
         DO i=1-OLx,sNx+OLx
          localT(i,j)= TracAB(i,j,k,bi,bj)
          locABT(i,j)= TracAB(i,j,k,bi,bj)
         ENDDO
        ENDDO
      ENDIF
      IF (diffK4 .NE. 0.) THEN
       CALL GAD_GRAD_X(bi,bj,k,xA,localT,fZon,myThid)
       CALL GAD_GRAD_Y(bi,bj,k,yA,localT,fMer,myThid)
       CALL GAD_DEL2(bi,bj,k,fZon,fMer,df4,myThid)
      ENDIF
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
        fZon(i,j) = 0.d0
       ENDDO
      ENDDO
      IF (calcAdvection) THEN
        IF (advectionScheme.EQ.ENUM_CENTERED_2ND) THEN
          CALL GAD_C2_ADV_X(bi,bj,k,uTrans,locABT,af,myThid)
        ELSEIF ( advectionScheme.EQ.ENUM_UPWIND_1RST
     &          .OR. advectionScheme.EQ.ENUM_DST2 ) THEN
          CALL GAD_DST2U1_ADV_X( bi,bj,k, advectionScheme, .TRUE.,
     I            deltaTLev(k), uTrans, uFld, locABT,
     O            af, myThid )
        ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN
          CALL GAD_FLUXLIMIT_ADV_X( bi,bj,k, .TRUE., deltaTLev(k),
     I            uTrans, uFld, maskW(1-Olx,1-Oly,k,bi,bj), locABT,
     O            af, myThid )
        ELSEIF (advectionScheme.EQ.ENUM_UPWIND_3RD ) THEN
          CALL GAD_U3_ADV_X(bi,bj,k,uTrans,locABT,af,myThid)
        ELSEIF (advectionScheme.EQ.ENUM_CENTERED_4TH) THEN
          CALL GAD_C4_ADV_X(bi,bj,k,uTrans,locABT,af,myThid)
        ELSEIF (advectionScheme.EQ.ENUM_DST3 ) THEN
          CALL GAD_DST3_ADV_X( bi,bj,k, .TRUE., deltaTLev(k),
     I            uTrans, uFld, maskW(1-Olx,1-Oly,k,bi,bj), locABT,
     O            af, myThid )
        ELSEIF (advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
         IF ( inAdMode ) THEN
          CALL GAD_DST3_ADV_X( bi,bj,k, .TRUE., deltaTLev(k),
     I           uTrans, uFld, maskW(1-Olx,1-Oly,k,bi,bj), locABT,
     O           af, myThid )
         ELSE
          CALL GAD_DST3FL_ADV_X( bi,bj,k, .TRUE., deltaTLev(k),
     I           uTrans, uFld, maskW(1-Olx,1-Oly,k,bi,bj), locABT,
     O           af, myThid )
         ENDIF
        ELSEIF (advectionScheme.EQ.ENUM_OS7MP ) THEN
          CALL GAD_OS7MP_ADV_X( bi,bj,k, .TRUE., deltaTLev(k),
     I            uTrans, uFld, maskW(1-Olx,1-Oly,k,bi,bj), locABT,
     O            af, myThid )
        ELSE
         STOP 'GAD_CALC_RHS: Bad advectionScheme (X)'
        ENDIF
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          fZon(i,j) = fZon(i,j) + af(i,j)
         ENDDO
        ENDDO
      ENDIF
      IF (diffKh.NE.0.) THEN
       CALL GAD_DIFF_X(bi,bj,k,xA,diffKh,localT,df,myThid)
      ELSE
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         df(i,j) = 0.d0
        ENDDO
       ENDDO
      ENDIF
      IF (diffK4 .NE. 0.) THEN
       CALL GAD_BIHARM_X(bi,bj,k,xA,df4,diffK4,df,myThid)
      ENDIF
      IF ( trUseGMRedi ) THEN
        IF ( applyAB_onTracer ) THEN
          CALL GMREDI_XTRANSPORT(
     I         iMin,iMax,jMin,jMax,bi,bj,k,
     I         xA,TracerN,tracerIdentity,
     U         df,
     I         myThid)
        ELSE
          CALL GMREDI_XTRANSPORT(
     I         iMin,iMax,jMin,jMax,bi,bj,k,
     I         xA,TracAB, tracerIdentity,
     U         df,
     I         myThid)
        ENDIF
      ENDIF
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
        fZon(i,j) = fZon(i,j) + df(i,j)*rhoFacC(k)
       ENDDO
      ENDDO
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
        fMer(i,j) = 0.d0
       ENDDO
      ENDDO
      IF (calcAdvection) THEN
        IF (advectionScheme.EQ.ENUM_CENTERED_2ND) THEN
          CALL GAD_C2_ADV_Y(bi,bj,k,vTrans,locABT,af,myThid)
        ELSEIF ( advectionScheme.EQ.ENUM_UPWIND_1RST
     &          .OR. advectionScheme.EQ.ENUM_DST2 ) THEN
          CALL GAD_DST2U1_ADV_Y( bi,bj,k, advectionScheme, .TRUE.,
     I            deltaTLev(k), vTrans, vFld, locABT,
     O            af, myThid )
        ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN
          CALL GAD_FLUXLIMIT_ADV_Y( bi,bj,k, .TRUE., deltaTLev(k),
     I            vTrans, vFld, maskS(1-Olx,1-Oly,k,bi,bj), locABT,
     O            af, myThid )
        ELSEIF (advectionScheme.EQ.ENUM_UPWIND_3RD ) THEN
          CALL GAD_U3_ADV_Y(bi,bj,k,vTrans,locABT,af,myThid)
        ELSEIF (advectionScheme.EQ.ENUM_CENTERED_4TH) THEN
          CALL GAD_C4_ADV_Y(bi,bj,k,vTrans,locABT,af,myThid)
        ELSEIF (advectionScheme.EQ.ENUM_DST3 ) THEN
          CALL GAD_DST3_ADV_Y( bi,bj,k, .TRUE., deltaTLev(k),
     I            vTrans, vFld, maskS(1-Olx,1-Oly,k,bi,bj), locABT,
     O            af, myThid )
        ELSEIF (advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
         IF ( inAdMode ) THEN
          CALL GAD_DST3_ADV_Y( bi,bj,k, .TRUE., deltaTLev(k),
     I           vTrans, vFld, maskS(1-Olx,1-Oly,k,bi,bj), locABT,
     O           af, myThid )
         ELSE
          CALL GAD_DST3FL_ADV_Y( bi,bj,k, .TRUE., deltaTLev(k),
     I           vTrans, vFld, maskS(1-Olx,1-Oly,k,bi,bj), locABT,
     O           af, myThid )
         ENDIF
        ELSEIF (advectionScheme.EQ.ENUM_OS7MP ) THEN
          CALL GAD_OS7MP_ADV_Y( bi,bj,k, .TRUE., deltaTLev(k),
     I            vTrans, vFld, maskS(1-Olx,1-Oly,k,bi,bj), locABT,
     O            af, myThid )
        ELSE
          STOP 'GAD_CALC_RHS: Bad advectionScheme (Y)'
        ENDIF
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          fMer(i,j) = fMer(i,j) + af(i,j)
         ENDDO
        ENDDO
      ENDIF
      IF (diffKh.NE.0.) THEN
       CALL GAD_DIFF_Y(bi,bj,k,yA,diffKh,localT,df,myThid)
      ELSE
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         df(i,j) = 0.d0
        ENDDO
       ENDDO
      ENDIF
      IF (diffK4 .NE. 0.) THEN
       CALL GAD_BIHARM_Y(bi,bj,k,yA,df4,diffK4,df,myThid)
      ENDIF
      IF ( trUseGMRedi ) THEN
        IF ( applyAB_onTracer ) THEN
          CALL GMREDI_YTRANSPORT(
     I         iMin,iMax,jMin,jMax,bi,bj,k,
     I         yA,TracerN,tracerIdentity,
     U         df,
     I         myThid)
        ELSE
          CALL GMREDI_YTRANSPORT(
     I         iMin,iMax,jMin,jMax,bi,bj,k,
     I         yA,TracAB, tracerIdentity,
     U         df,
     I         myThid)
        ENDIF
      ENDIF
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
        fMer(i,j) = fMer(i,j) + df(i,j)*rhoFacC(k)
       ENDDO
      ENDDO
      IF (calcAdvection .AND. .NOT.implicitAdvection .AND. k.GE.2) THEN
        IF (vertAdvecScheme.EQ.ENUM_CENTERED_2ND) THEN
          CALL GAD_C2_ADV_R(bi,bj,k,rTrans,TracAB,af,myThid)
        ELSEIF ( vertAdvecScheme.EQ.ENUM_UPWIND_1RST
     &          .OR. vertAdvecScheme.EQ.ENUM_DST2 ) THEN
          CALL GAD_DST2U1_ADV_R( bi,bj,k, vertAdvecScheme,
     I         deltaTLev(k),rTrans,wFld,TracAB(1-Olx,1-Oly,1,bi,bj),
     O         af, myThid )
        ELSEIF (vertAdvecScheme.EQ.ENUM_FLUX_LIMIT) THEN
          CALL GAD_FLUXLIMIT_ADV_R( bi,bj,k,
     I         deltaTLev(k),rTrans,wFld,TracAB(1-Olx,1-Oly,1,bi,bj),
     O         af, myThid )
        ELSEIF (vertAdvecScheme.EQ.ENUM_UPWIND_3RD ) THEN
          CALL GAD_U3_ADV_R(bi,bj,k,rTrans,TracAB,af,myThid)
        ELSEIF (vertAdvecScheme.EQ.ENUM_CENTERED_4TH) THEN
          CALL GAD_C4_ADV_R(bi,bj,k,rTrans,TracAB,af,myThid)
        ELSEIF (vertAdvecScheme.EQ.ENUM_DST3 ) THEN
          CALL GAD_DST3_ADV_R( bi,bj,k,
     I         deltaTLev(k),rTrans,wFld,TracAB(1-Olx,1-Oly,1,bi,bj),
     O         af, myThid )
        ELSEIF (vertAdvecScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
          IF ( inAdMode ) THEN
           CALL GAD_DST3_ADV_R( bi,bj,k,
     I         deltaTLev(k),rTrans,wFld,TracAB(1-Olx,1-Oly,1,bi,bj),
     O         af, myThid )
          ELSE
           CALL GAD_DST3FL_ADV_R( bi,bj,k,
     I         deltaTLev(k),rTrans,wFld,TracAB(1-Olx,1-Oly,1,bi,bj),
     O         af, myThid )
          ENDIF
        ELSEIF (vertAdvecScheme.EQ.ENUM_OS7MP ) THEN
           CALL GAD_OS7MP_ADV_R( bi,bj,k,
     I         deltaTLev(k),rTrans,wFld,TracAB(1-Olx,1-Oly,1,bi,bj),
     O         af, myThid )
        ELSE
          STOP 'GAD_CALC_RHS: Bad vertAdvecScheme (R)'
        ENDIF
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          fVerT(i,j,kUp) = fVerT(i,j,kUp) + af(i,j)
         ENDDO
        ENDDO
      ENDIF
      IF (implicitDiffusion) THEN
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         df(i,j) = 0.d0
        ENDDO
       ENDDO
      ELSE
       IF ( applyAB_onTracer ) THEN
         CALL GAD_DIFF_R(bi,bj,k,KappaR,TracerN,df,myThid)
       ELSE
         CALL GAD_DIFF_R(bi,bj,k,KappaR,TracAB, df,myThid)
       ENDIF
      ENDIF
      IF ( trUseGMRedi ) THEN
        IF ( applyAB_onTracer ) THEN
          CALL GMREDI_RTRANSPORT(
     I         iMin,iMax,jMin,jMax,bi,bj,k,
     I         TracerN,tracerIdentity,
     U         df,
     I         myThid)
        ELSE
          CALL GMREDI_RTRANSPORT(
     I         iMin,iMax,jMin,jMax,bi,bj,k,
     I         TracAB, tracerIdentity,
     U         df,
     I         myThid)
        ENDIF
      ENDIF
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
        fVerT(i,j,kUp) = fVerT(i,j,kUp) + df(i,j)*maskUp(i,j)
       ENDDO
      ENDDO
      DO j=1-Oly,sNy+Oly-1
       DO i=1-Olx,sNx+Olx-1
        gTracer(i,j,k,bi,bj)=gTracer(i,j,k,bi,bj)
     &   -recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
     &   *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)*recip_rhoFacC(k)
     &   *( (fZon(i+1,j)-fZon(i,j))
     &     +(fMer(i,j+1)-fMer(i,j))
     &     +(fVerT(i,j,kDown)-fVerT(i,j,kUp))*rkSign
     &     -localT(i,j)*( (uTrans(i+1,j)-uTrans(i,j))
     &                   +(vTrans(i,j+1)-vTrans(i,j))
     &                   +(rTransKp1(i,j)-rTrans(i,j))*rAdvFac
     &                  )*advFac
     &    )
       ENDDO
      ENDDO
      IF ( debugLevel .GE. debLevB
     &   .AND. tracerIdentity.EQ.GAD_TEMPERATURE
     &   .AND. k.EQ.2 .AND. myIter.EQ.1+nIter0
     &   .AND. nPx.EQ.1 .AND. nPy.EQ.1
     &   .AND. useCubedSphereExchange ) THEN
        CALL DEBUG_CS_CORNER_UV( ' fZon,fMer from GAD_CALC_RHS',
     &             fZon,fMer, k, standardMessageUnit,bi,bj,myThid )
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_DEL2(
     I           bi,bj,k,
     I           dTdx,dTdy,
     O           del2,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 dTdx(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 dTdy(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 del2(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
        del2(i,j)= 0.d0
       ENDDO
      ENDDO
      DO j=1-Oly,sNy+Oly-1
       DO i=1-Olx,sNx+Olx-1
        del2(i,j)=recip_rA(i,j,bi,bj)*recip_deepFac2C(k)
     &           *recip_drF(k)*recip_hFacC(i,j,k,bi,bj)
     &           *( ( dTdx(i+1,j)-dTdx(i,j) )
     &             +( dTdy(i,j+1)-dTdy(i,j) )
     &            )
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_DIFF_R(
     I           bi,bj,k,
     I           KappaR,
     I           tracer,
     O           dfr,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER bi,bj,k
      Real*8 KappaR(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      Real*8 dfr   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j,km1
      km1=MAX(1,k-1)
      IF (k.EQ.1 .OR. k.GT.Nr) THEN
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         dfr(i,j) = 0.
        ENDDO
       ENDDO
      ELSE
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         dfr(i,j) = -KappaR(i,j)
     &            *rA(i,j,bi,bj)*deepFac2F(k)*rhoFacF(k)
     &            *recip_drC(k)
     &            *(tracer(i,j,k,bi,bj)-tracer(i,j,km1,bi,bj))*rkSign
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_DIFF_X(
     I           bi,bj,k,
     I           xA, diffKh,
     I           tracer,
     O           dfx,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 xA    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 diffKh
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 dfx   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      DO j=1-Oly,sNy+Oly
       dfx(1-Olx,j)=0.
       DO i=1-Olx+1,sNx+Olx
        dfx(i,j) = -diffKh*xA(i,j)
     &      *recip_dxC(i,j,bi,bj)*recip_deepFacC(k)
     &      *(tracer(i,j)-tracer(i-1,j))
     &      *cosFacU(j,bi,bj)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_DIFF_Y(
     I           bi,bj,k,
     I           yA, diffKh,
     I           tracer,
     O           dfy,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 yA    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 diffKh
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 dfy   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      DO i=1-Olx,sNx+Olx
       dfy(i,1-Oly)=0.
      ENDDO
      DO j=1-Oly+1,sNy+Oly
       DO i=1-Olx,sNx+Olx
        dfy(i,j) = -diffKh*yA(i,j)
     &           *recip_dyC(i,j,bi,bj)*recip_deepFacC(k)
     &           *(tracer(i,j)-tracer(i,j-1))
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_DST2U1_ADV_R(
     I           bi,bj,k, advectionScheme,
     I           deltaTloc, rTrans, wFld,
     I           tracer,
     O           wT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      INTEGER advectionScheme
      Real*8 deltaTloc
      Real*8 rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 wFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      INTEGER myThid
      Real*8 wT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j,km1
      Real*8 wLoc, wCFL, rLimit, wAbs
      rLimit = 0.d0
      IF ( advectionScheme.EQ.ENUM_DST2 ) rLimit = 1.d0
      km1=MAX(1,k-1)
      IF ( k.LE.1 .OR. k.GT.Nr) THEN
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         wT(i,j) = 0.
        ENDDO
       ENDDO
      ELSE
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         wLoc = wFld(i,j)
         wCFL = ABS(wLoc*deltaTloc*recip_drC(k))
         wAbs = ABS(rTrans(i,j))*rkSign
     &       *( 1.d0 - rLimit*(1.d0 - wCFL) )
         wT(i,j) = maskC(i,j,km1,bi,bj)*(
     &             ( rTrans(i,j)+wAbs )* 0.5d0 * tracer(i,j,km1)
     &           + ( rTrans(i,j)-wAbs )* 0.5d0 * tracer(i,j,k)
     &                                  )
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_DST2U1_IMPL_R( 
     I           bi,bj,k, iMin,iMax,jMin,jMax, 
     I           advectionScheme, deltaTarg, rTrans,
     O           a3d, b3d, c3d,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      INTEGER iMin,iMax,jMin,jMax
      INTEGER advectionScheme
      Real*8 deltaTarg(Nr)
      Real*8 rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 a3d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 b3d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 c3d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      INTEGER myThid
      INTEGER i,j
      Real*8 w_CFL, rLimit
      Real*8 rCenter, rUpwind
      Real*8 deltaTcfl
      rLimit = 0.d0
      IF ( advectionScheme.EQ.ENUM_DST2 ) rLimit = 1.d0
      IF ( k.GT.1 .AND. k.LE.Nr ) THEN
       deltaTcfl = deltaTarg(k)
       DO j=jMin,jMax
         DO i=iMin,iMax
           w_CFL = deltaTcfl*ABS(rTrans(i,j))
     &            *recip_rA(i,j,bi,bj)*recip_drC(k)
           rCenter = 0.5d0 *rTrans(i,j)*recip_rA(i,j,bi,bj)*rkSign
           rUpwind = ABS(rCenter)
     &             * ( 1.d0 - rLimit )
           a3d(i,j,k)   = a3d(i,j,k)
     &                  - (rCenter+rUpwind)*deltaTarg(k)
     &                   *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
           b3d(i,j,k)   = b3d(i,j,k)
     &                  - (rCenter-rUpwind)*deltaTarg(k)
     &                    *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
           b3d(i,j,k-1) = b3d(i,j,k-1)
     &                  + (rCenter+rUpwind)*deltaTarg(k-1)
     &                    *recip_hFacC(i,j,k-1,bi,bj)*recip_drF(k-1)
           c3d(i,j,k-1) = c3d(i,j,k-1)
     &                  + (rCenter-rUpwind)*deltaTarg(k-1)
     &                    *recip_hFacC(i,j,k-1,bi,bj)*recip_drF(k-1)
         ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_DST2U1_ADV_X(
     I           bi,bj,k, advectionScheme, calcCFL,
     I           deltaTloc, uTrans, uFld,
     I           tracer,
     O           uT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      INTEGER advectionScheme
      LOGICAL calcCFL
      Real*8 deltaTloc
      Real*8 uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 uT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      Real*8 uCFL, xLimit, uAbs
      xLimit = 0.d0
      IF ( advectionScheme.EQ.ENUM_DST2 ) xLimit = 1.d0
      DO j=1-Oly,sNy+Oly
       uT(1-Olx,j)=0.
      ENDDO
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx+1,sNx+Olx
        uCFL = uFld(i,j)
        IF ( calcCFL ) uCFL = ABS( uFld(i,j)*deltaTloc
     &                  *recip_dxC(i,j,bi,bj)*recip_deepFacC(k) )
        uAbs = ABS(uTrans(i,j))
     &       *( 1.d0 - xLimit*(1.d0 - uCFL) )
        uT(i,j) = ( uTrans(i,j)+uAbs )* 0.5d0 * tracer(i-1,j)
     &          + ( uTrans(i,j)-uAbs )* 0.5d0 * tracer(i,j)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_DST2U1_ADV_Y(
     I           bi,bj,k, advectionScheme, calcCFL,
     I           deltaTloc, vTrans, vFld,
     I           tracer,
     O           vT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj, k, advectionScheme
      LOGICAL calcCFL
      Real*8 deltaTloc
      Real*8 vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 vT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      Real*8 vCFL, yLimit, vAbs
      yLimit = 0.d0
      IF ( advectionScheme.EQ.ENUM_DST2 ) yLimit = 1.d0
      DO i=1-Olx,sNx+Olx
       vT(i,1-Oly)=0.
      ENDDO
      DO j=1-Oly+1,sNy+Oly
       DO i=1-Olx,sNx+Olx
        vCFL = vFld(i,j)
        IF ( calcCFL ) vCFL = ABS( vFld(i,j)*deltaTloc
     &                  *recip_dyC(i,j,bi,bj)*recip_deepFacC(k) )
        vAbs = ABS(vTrans(i,j))
     &       *( 1.d0 - yLimit*(1.d0 - vCFL) )
        vT(i,j) = ( vTrans(i,j)+vAbs )* 0.5d0 * tracer(i,j-1)
     &          + ( vTrans(i,j)-vAbs )* 0.5d0 * tracer(i,j)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_DST3_ADV_X(
     I           bi,bj,k, calcCFL, deltaTloc,
     I           uTrans, uFld,
     I           maskLocW, tracer,
     O           uT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      LOGICAL calcCFL
      Real*8 deltaTloc
      Real*8 uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 maskLocW(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 uT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      Real*8 Rjm,Rj,Rjp,uCFL,d0,d1
      DO j=1-Oly,sNy+Oly
       uT(1-Olx,j)=0.
       uT(2-Olx,j)=0.
       uT(sNx+Olx,j)=0.
      ENDDO
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx+2,sNx+Olx-1
        Rjp=(tracer(i+1,j)-tracer( i ,j))*maskLocW(i+1,j)
        Rj =(tracer( i ,j)-tracer(i-1,j))*maskLocW( i ,j)
        Rjm=(tracer(i-1,j)-tracer(i-2,j))*maskLocW(i-1,j)
        uCFL = uFld(i,j)
        IF ( calcCFL ) uCFL = ABS( uFld(i,j)*deltaTloc
     &                  *recip_dxC(i,j,bi,bj)*recip_deepFacC(k) )
        d0=(2.-uCFL)*(1.-uCFL)*oneSixth
        d1=(1.-uCFL*uCFL)*oneSixth
        uT(i,j)=
     &   0.5*(uTrans(i,j)+ABS(uTrans(i,j)))
     &      *( Tracer(i-1,j) + (d0*Rj+d1*Rjm) )
     &  +0.5*(uTrans(i,j)-ABS(uTrans(i,j)))
     &      *( Tracer( i ,j) - (d0*Rj+d1*Rjp) )
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_DST3_ADV_Y(
     I           bi,bj,k, calcCFL, deltaTloc,
     I           vTrans, vFld,
     I           maskLocS, tracer,
     O           vT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      LOGICAL calcCFL
      Real*8 deltaTloc
      Real*8 vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 maskLocS(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 vT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      Real*8 Rjm,Rj,Rjp,vCFL,d0,d1
      DO i=1-Olx,sNx+Olx
       vT(i,1-Oly)=0.
       vT(i,2-Oly)=0.
       vT(i,sNy+Oly)=0.
      ENDDO
      DO j=1-Oly+2,sNy+Oly-1
       DO i=1-Olx,sNx+Olx
        Rjp=(tracer(i,j+1)-tracer(i, j ))*maskLocS(i,j+1)
        Rj =(tracer(i, j )-tracer(i,j-1))*maskLocS(i, j )
        Rjm=(tracer(i,j-1)-tracer(i,j-2))*maskLocS(i,j-1)
        vCFL = vFld(i,j)
        IF ( calcCFL ) vCFL = ABS( vFld(i,j)*deltaTloc
     &                  *recip_dyC(i,j,bi,bj)*recip_deepFacC(k) )
        d0=(2.-vCFL)*(1.-vCFL)*oneSixth
        d1=(1.-vCFL*vCFL)*oneSixth
        vT(i,j)=
     &   0.5*(vTrans(i,j)+ABS(vTrans(i,j)))
     &      *( Tracer(i,j-1) + (d0*Rj+d1*Rjm) )
     &  +0.5*(vTrans(i,j)-ABS(vTrans(i,j)))
     &      *( Tracer(i, j ) - (d0*Rj+d1*Rjp) )
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_DST3_ADV_R(
     I           bi,bj,k,dTarg,
     I           rTrans, wFld,
     I           tracer,
     O           wT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      Real*8 dTarg
      Real*8 rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 wFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      INTEGER myThid
      Real*8 wT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j,kp1,km1,km2
      Real*8 wLoc
      Real*8 Rjm,Rj,Rjp,cfl,d0,d1
      km2=MAX(1,k-2)
      km1=MAX(1,k-1)
      kp1=MIN(Nr,k+1)
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
        Rjp=(tracer(i,j,k)-tracer(i,j,kp1))
     &         *maskC(i,j,kp1,bi,bj)
        Rj =(tracer(i,j,km1)-tracer(i,j,k))
     &         *maskC(i,j,k,bi,bj)*maskC(i,j,km1,bi,bj)
        Rjm=(tracer(i,j,km2)-tracer(i,j,km1))
     &         *maskC(i,j,km1,bi,bj)
        wLoc = wFld(i,j)
        cfl=ABS(wLoc*dTarg*recip_drC(k))
        d0=(2.-cfl)*(1.-cfl)*oneSixth
        d1=(1.-cfl*cfl)*oneSixth
        wT(i,j)=
     &    0.5*(rTrans(i,j)+ABS(rTrans(i,j)))
     &       *( tracer(i,j, k ) + (d0*Rj+d1*Rjp) )
     &   +0.5*(rTrans(i,j)-ABS(rTrans(i,j)))
     &       *( tracer(i,j,km1) - (d0*Rj+d1*Rjm) )
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_DST3FL_ADV_X(
     I           bi,bj,k, calcCFL, deltaTloc,
     I           uTrans, uFld,
     I           maskLocW, tracer,
     O           uT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      LOGICAL calcCFL
      Real*8 deltaTloc
      Real*8 uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 maskLocW(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      INTEGER i,j
      Real*8 Rjm,Rj,Rjp,uCFL,d0,d1,psiP,psiM,thetaP,thetaM
      Real*8 thetaMax
      PARAMETER( thetaMax = 1.D+20 )
      DO j=1-Oly,sNy+Oly
       uT(1-Olx,j)=0.d0
       uT(2-Olx,j)=0.d0
       uT(sNx+Olx,j)=0.d0
      ENDDO
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx+2,sNx+Olx-1
        Rjp=(tracer(i+1,j)-tracer( i ,j))*maskLocW(i+1,j)
        Rj =(tracer( i ,j)-tracer(i-1,j))*maskLocW( i ,j)
        Rjm=(tracer(i-1,j)-tracer(i-2,j))*maskLocW(i-1,j)
        uCFL = uFld(i,j)
        IF ( calcCFL ) uCFL = ABS( uFld(i,j)*deltaTloc
     &                  *recip_dxC(i,j,bi,bj)*recip_deepFacC(k) )
        d0=(2.d0 -uCFL)*(1.d0 -uCFL)*oneSixth
        d1=(1.d0 -uCFL*uCFL)*oneSixth
        IF ( ABS(Rj)*thetaMax .LE. ABS(Rjm) ) THEN
          thetaP=SIGN(thetaMax,Rjm*Rj)
        ELSE
          thetaP=Rjm/Rj
        ENDIF
        IF ( ABS(Rj)*thetaMax .LE. ABS(Rjp) ) THEN
          thetaM=SIGN(thetaMax,Rjp*Rj)
        ELSE
          thetaM=Rjp/Rj
        ENDIF
        psiP=d0+d1*thetaP
        psiP=MAX(0.d0,MIN(MIN(1.d0,psiP),
     &                       thetaP*(1.d0 -uCFL)/(uCFL+1.D-20) ))
        psiM=d0+d1*thetaM
        psiM=MAX(0.d0,MIN(MIN(1.d0,psiM),
     &                       thetaM*(1.d0 -uCFL)/(uCFL+1.D-20) ))
        uT(i,j)=
     &   0.5*(uTrans(i,j)+ABS(uTrans(i,j)))
     &      *( Tracer(i-1,j) + psiP*Rj )
     &  +0.5*(uTrans(i,j)-ABS(uTrans(i,j)))
     &      *( Tracer( i ,j) - psiM*Rj )
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_DST3FL_ADV_Y(
     I           bi,bj,k, calcCFL, deltaTloc,
     I           vTrans, vFld,
     I           maskLocS, tracer,
     O           vT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      LOGICAL calcCFL
      Real*8 deltaTloc
      Real*8 vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 maskLocS(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      INTEGER i,j
      Real*8 Rjm,Rj,Rjp,vCFL,d0,d1,psiP,psiM,thetaP,thetaM
      Real*8 thetaMax
      PARAMETER( thetaMax = 1.D+20 )
      DO i=1-Olx,sNx+Olx
       vT(i,1-Oly)=0.d0
       vT(i,2-Oly)=0.d0
       vT(i,sNy+Oly)=0.d0
      ENDDO
      DO j=1-Oly+2,sNy+Oly-1
       DO i=1-Olx,sNx+Olx
        Rjp=(tracer(i,j+1)-tracer(i, j ))*maskLocS(i,j+1)
        Rj =(tracer(i, j )-tracer(i,j-1))*maskLocS(i, j )
        Rjm=(tracer(i,j-1)-tracer(i,j-2))*maskLocS(i,j-1)
        vCFL = vFld(i,j)
        IF ( calcCFL ) vCFL = ABS( vFld(i,j)*deltaTloc
     &                  *recip_dyC(i,j,bi,bj)*recip_deepFacC(k) )
        d0=(2.d0 -vCFL)*(1.d0 -vCFL)*oneSixth
        d1=(1.d0 -vCFL*vCFL)*oneSixth
        IF ( ABS(Rj)*thetaMax .LE. ABS(Rjm) ) THEN
          thetaP=SIGN(thetaMax,Rjm*Rj)
        ELSE
          thetaP=Rjm/Rj
        ENDIF
        IF ( ABS(Rj)*thetaMax .LE. ABS(Rjp) ) THEN
          thetaM=SIGN(thetaMax,Rjp*Rj)
        ELSE
          thetaM=Rjp/Rj
        ENDIF
        psiP=d0+d1*thetaP
        psiP=MAX(0.d0,MIN(MIN(1.d0,psiP),
     &                       thetaP*(1.d0 -vCFL)/(vCFL+1.D-20) ))
        psiM=d0+d1*thetaM
        psiM=MAX(0.d0,MIN(MIN(1.d0,psiM),
     &                       thetaM*(1.d0 -vCFL)/(vCFL+1.D-20) ))
        vT(i,j)=
     &   0.5*(vTrans(i,j)+ABS(vTrans(i,j)))
     &      *( Tracer(i,j-1) + psiP*Rj )
     &  +0.5*(vTrans(i,j)-ABS(vTrans(i,j)))
     &      *( Tracer(i, j ) - psiM*Rj )
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_DST3FL_ADV_R(
     I           bi,bj,k,dTarg,
     I           rTrans, wFld,
     I           tracer,
     O           wT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      Real*8 dTarg
      Real*8 rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 wFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      INTEGER myThid
      Real*8 wT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j,kp1,km1,km2
      Real*8 Rjm,Rj,Rjp,wCFL,d0,d1
      Real*8 psiP,psiM,thetaP,thetaM
      Real*8 wLoc
      Real*8 thetaMax
      PARAMETER( thetaMax = 1.D+20 )
      km2=MAX(1,k-2)
      km1=MAX(1,k-1)
      kp1=MIN(Nr,k+1)
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
        Rjp=(tracer(i,j,k)-tracer(i,j,kp1))
     &         *maskC(i,j,kp1,bi,bj)
        Rj =(tracer(i,j,km1)-tracer(i,j,k))
     &         *maskC(i,j,k,bi,bj)*maskC(i,j,km1,bi,bj)
        Rjm=(tracer(i,j,km2)-tracer(i,j,km1))
     &         *maskC(i,j,km1,bi,bj)
        wLoc = wFld(i,j)
        wCFL = ABS(wLoc*dTarg*recip_drC(k))
        d0=(2.d0 -wCFL)*(1.d0 -wCFL)*oneSixth
        d1=(1.d0 -wCFL*wCFL)*oneSixth
        IF ( ABS(Rj)*thetaMax .LE. ABS(Rjm) ) THEN
          thetaP=SIGN(thetaMax,Rjm*Rj)
        ELSE
          thetaP=Rjm/Rj
        ENDIF
        IF ( ABS(Rj)*thetaMax .LE. ABS(Rjp) ) THEN
          thetaM=SIGN(thetaMax,Rjp*Rj)
        ELSE
          thetaM=Rjp/Rj
        ENDIF
        psiP=d0+d1*thetaP
        psiP=MAX(0.d0,MIN(MIN(1.d0,psiP),
     &                       thetaP*(1.d0 -wCFL)/(wCFL+1.D-20) ))
        psiM=d0+d1*thetaM
        psiM=MAX(0.d0,MIN(MIN(1.d0,psiM),
     &                       thetaM*(1.d0 -wCFL)/(wCFL+1.D-20) ))
        wT(i,j)=
     &   0.5*(rTrans(i,j)+ABS(rTrans(i,j)))
     &      *( tracer(i,j, k ) + psiM*Rj )
     &  +0.5*(rTrans(i,j)-ABS(rTrans(i,j)))
     &      *( tracer(i,j,km1) - psiP*Rj )
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_DST3FL_IMPL_R(
     I           bi,bj,k, iMin,iMax,jMin,jMax,
     I           deltaTarg, rTrans, tFld,
     O           a5d, b5d, c5d, d5d, e5d,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      INTEGER iMin,iMax,jMin,jMax
      Real*8 deltaTarg(Nr)
      Real*8 rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 a5d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 b5d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 c5d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 d5d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 e5d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      INTEGER myThid
      INTEGER i,j,kp1,km2
      Real*8 wCFL, rCenter, rUpwind
      Real*8 lowFac (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 highFac(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rC4km, rC4kp
      Real*8 mskM, mskP, maskM2, maskP1
      Real*8 Rj, Rjh, cL1, cH3, cM2, th1, th2
      Real*8 deltaTcfl
      IF ( k.GT.1 .AND. k.LE.Nr ) THEN
       km2=MAX(1,k-2)
       kp1=MIN(Nr,k+1)
       maskP1 = 1.d0
       maskM2 = 1.d0
       IF ( k.LE.2 ) maskM2 = 0.d0
       IF ( k.GE.Nr) maskP1 = 0.d0
       deltaTcfl = deltaTarg(k)
       DO j=jMin,jMax
         DO i=iMin,iMax
           wCFL = deltaTcfl*ABS(rTrans(i,j))
     &           *recip_rA(i,j,bi,bj)*recip_drC(k)
           cL1 = (2.d0 -wCFL)*(1.d0 -wCFL)*oneSixth
           cH3 = (1.d0 -wCFL*wCFL)*oneSixth
           cM2 = (1.d0 + wCFL)/( wCFL +1.D-20)
           Rj =(tFld(i,j,k)  -tFld(i,j,k-1))
           IF ( rTrans(i,j).GT.0.d0 ) THEN
             Rjh = (tFld(i,j,k-1)-tFld(i,j,km2))*maskC(i,j,km2,bi,bj)
           ELSE
             Rjh = (tFld(i,j,kp1)-tFld(i,j,k)  )*maskC(i,j,kp1,bi,bj)
           ENDIF
           IF ( Rj*Rjh.LE.0.d0 ) THEN
             lowFac(i,j) = 0.d0
             highFac(i,j)= 0.d0
           ELSE
             Rj  = ABS(Rj)
             Rjh = ABS(Rjh)
             th1 = cL1*Rj+cH3*Rjh
             th2 = cM2*Rjh
            IF     ( th1.LE.th2 .AND. th1.LE.Rj ) THEN
             lowFac(i,j) = cL1
             highFac(i,j)= cH3
            ELSEIF ( th2.LT.th1 .AND. th2.LE.Rj ) THEN
             lowFac(i,j) = 0.d0
             highFac(i,j)= cM2
            ELSE
             lowFac(i,j) = 1.d0
             highFac(i,j)= 0.d0
            ENDIF
           ENDIF
         ENDDO
       ENDDO
       DO j=jMin,jMax
         DO i=iMin,iMax
           rCenter= 0.5d0 *rTrans(i,j)*recip_rA(i,j,bi,bj)*rkSign
           mskM   = maskC(i,j,km2,bi,bj)*maskM2
           mskP   = maskC(i,j,kp1,bi,bj)*maskP1
           rUpwind= (0.5d0 -lowFac(i,j))*ABS(rCenter)*2.d0
           rC4km  = highFac(i,j)*(rCenter+ABS(rCenter))*mskM
           rC4kp  = highFac(i,j)*(rCenter-ABS(rCenter))*mskP
           a5d(i,j,k)   = a5d(i,j,k)
     &                  + rC4km
     &                   *deltaTarg(k)
     &                   *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
           b5d(i,j,k)   = b5d(i,j,k)
     &                  - ( (rCenter+rUpwind) + rC4km )
     &                   *deltaTarg(k)
     &                   *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
           c5d(i,j,k)   = c5d(i,j,k)
     &                  - ( (rCenter-rUpwind) + rC4kp )
     &                   *deltaTarg(k)
     &                    *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
           d5d(i,j,k)   = d5d(i,j,k)
     &                  + rC4kp
     &                   *deltaTarg(k)
     &                   *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
           b5d(i,j,k-1) = b5d(i,j,k-1)
     &                  - rC4km
     &                   *deltaTarg(k-1)
     &                   *recip_hFacC(i,j,k-1,bi,bj)*recip_drF(k-1)
           c5d(i,j,k-1) = c5d(i,j,k-1)
     &                  + ( (rCenter+rUpwind) + rC4km )
     &                   *deltaTarg(k-1)
     &                   *recip_hFacC(i,j,k-1,bi,bj)*recip_drF(k-1)
           d5d(i,j,k-1) = d5d(i,j,k-1)
     &                  + ( (rCenter-rUpwind) + rC4kp )
     &                   *deltaTarg(k-1)
     &                   *recip_hFacC(i,j,k-1,bi,bj)*recip_drF(k-1)
           e5d(i,j,k-1) = e5d(i,j,k-1)
     &                  - rC4kp
     &                   *deltaTarg(k-1)
     &                   *recip_hFacC(i,j,k-1,bi,bj)*recip_drF(k-1)
         ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_FLUXLIMIT_ADV_R(
     I           bi,bj,k,dTarg,
     I           rTrans, wFld,
     I           tracer,
     O           wT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER bi,bj,k
      Real*8 dTarg
      Real*8 rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 wFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      INTEGER myThid
      Real*8 wT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j,kp1,km1,km2
      Real*8 Cr,Rjm,Rj,Rjp
      Real*8 wLoc, wCFL
C
      Real*8 Limiter
      Limiter(Cr)=max(0.d0,max(min(1.d0,2.d0*Cr),
     &                         min(2.d0,Cr))) 
      km2=MAX(1,k-2)
      km1=MAX(1,k-1)
      kp1=MIN(Nr,k+1)
      IF ( k.GT.Nr) THEN
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         wT(i,j) = 0.
        ENDDO
       ENDDO
      ELSE
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         wLoc = wFld(i,j)
         wCFL = ABS( wLoc*dTarg*recip_drC(k) )
         Rjp=(tracer(i,j,kp1)-tracer(i,j,k))
     &        *maskC(i,j,kp1,bi,bj)
         Rj= (tracer(i,j,k)  -tracer(i,j,kM1))
         Rjm=(tracer(i,j,km1)-tracer(i,j,kM2))
     &        *maskC(i,j,km2,bi,bj)
         IF (Rj.NE.0.) THEN
          IF (rTrans(i,j).LT.0.) THEN
            Cr=Rjm/Rj
          ELSE
            Cr=Rjp/Rj
          ENDIF
         ELSE
          IF (rTrans(i,j).LT.0.) THEN
            Cr=Rjm*1.E20
          ELSE
            Cr=Rjp*1.E20
          ENDIF
         ENDIF
         Cr=Limiter(Cr)
         wT(i,j) = maskC(i,j,kM1,bi,bj)*(
     &     rTrans(i,j)*
     &        (tracer(i,j,k)+tracer(i,j,kM1))*0.5d0
     &    +ABS(rTrans(i,j))*((1.-Cr)+wCFL*Cr)
     &                     *Rj*0.5d0 )
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_FLUXLIMIT_IMPL_R( 
     I           bi,bj,k, iMin,iMax,jMin,jMax, 
     I           deltaTarg, rTrans, tFld,
     O           a3d, b3d, c3d,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER bi,bj,k
      INTEGER iMin,iMax,jMin,jMax
      Real*8 deltaTarg(Nr)
      Real*8 rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 a3d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 b3d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 c3d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      INTEGER myThid
      INTEGER i,j,kp1,km1,km2
      Real*8 Cr,Rjm,Rj,Rjp, w_CFL
      Real*8 upwindFac(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rCenter, rUpwind
      Real*8 deltaTcfl
C
      Real*8 Limiter
      Limiter(Cr)=max(0.d0,max(min(1.d0,2.d0*Cr),
     &                         min(2.d0,Cr))) 
      km2=MAX(1,k-2)
      km1=MAX(1,k-1)
      kp1=MIN(Nr,k+1)
      IF ( k.GT.1 .AND. k.LE.Nr ) THEN
       deltaTcfl = deltaTarg(k)
       DO j=jMin,jMax
        DO i=iMin,iMax
         w_CFL = deltaTcfl*rTrans(i,j)*recip_rA(i,j,bi,bj)*recip_drC(k)
         Rjp=(tFld(i,j,kp1)-tFld(i,j,k)  )*maskC(i,j,kp1,bi,bj)
         Rj =(tFld(i,j,k)  -tFld(i,j,km1))
         Rjm=(tFld(i,j,km1)-tFld(i,j,km2))*maskC(i,j,km2,bi,bj)
         IF ( Rj.NE.0.d0) THEN
          IF (rTrans(i,j).LT.0.d0) THEN
            Cr=Rjm/Rj
          ELSE
            Cr=Rjp/Rj
          ENDIF
          upwindFac(i,j) = 1.d0
     &                   - Limiter(Cr) * ( 1.d0 + ABS(w_CFL) )
          upwindFac(i,j) = MAX( -1.d0, upwindFac(i,j) )
         ELSE
          upwindFac(i,j) = 0.d0
         ENDIF
        ENDDO
       ENDDO
       DO j=jMin,jMax
         DO i=iMin,iMax
           rCenter = 0.5d0 *rTrans(i,j)*recip_rA(i,j,bi,bj)*rkSign
           rUpwind = ABS(rCenter)*upwindFac(i,j)
           a3d(i,j,k)   = a3d(i,j,k)
     &                  - (rCenter+rUpwind)*deltaTarg(k)
     &                   *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
           b3d(i,j,k)   = b3d(i,j,k)
     &                  - (rCenter-rUpwind)*deltaTarg(k)
     &                    *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
           b3d(i,j,k-1) = b3d(i,j,k-1)
     &                  + (rCenter+rUpwind)*deltaTarg(k-1)
     &                    *recip_hFacC(i,j,k-1,bi,bj)*recip_drF(k-1)
           c3d(i,j,k-1) = c3d(i,j,k-1)
     &                  + (rCenter-rUpwind)*deltaTarg(k-1)
     &                    *recip_hFacC(i,j,k-1,bi,bj)*recip_drF(k-1)
         ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_FLUXLIMIT_ADV_X(
     I           bi,bj,k, calcCFL, deltaTloc,
     I           uTrans, uFld,
     I           maskLocW, tracer,
     O           uT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      LOGICAL calcCFL
      Real*8 deltaTloc
      Real*8 uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 maskLocW(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 uT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      Real*8 Cr,Rjm,Rj,Rjp
      Real*8 uCFL
C
      Real*8 Limiter
      Limiter(Cr)=max(0.d0,max(min(1.d0,2.d0*Cr),
     &                         min(2.d0,Cr))) 
      DO j=1-Oly,sNy+Oly
       uT(1-Olx,j)=0.
       uT(2-Olx,j)=0.
       uT(sNx+Olx,j)=0.
      ENDDO
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx+2,sNx+Olx-1
        uCFL = uFld(i,j)
        IF ( calcCFL ) uCFL = ABS( uFld(i,j)*deltaTloc
     &                  *recip_dxC(i,j,bi,bj)*recip_deepFacC(k) )
        Rjp=(tracer(i+1,j)-tracer( i ,j))*maskLocW(i+1,j)
        Rj =(tracer( i ,j)-tracer(i-1,j))*maskLocW( i ,j)
        Rjm=(tracer(i-1,j)-tracer(i-2,j))*maskLocW(i-1,j)
        IF (Rj.NE.0.) THEN
         IF (uTrans(i,j).GT.0) THEN
           Cr=Rjm/Rj
         ELSE
           Cr=Rjp/Rj
         ENDIF
        ELSE
         IF (uTrans(i,j).GT.0) THEN
           Cr=Rjm*1.E20
         ELSE
           Cr=Rjp*1.E20
         ENDIF
        ENDIF
        Cr=Limiter(Cr)
        uT(i,j) =
     &   uTrans(i,j)*(Tracer(i,j)+Tracer(i-1,j))*0.5d0
     &   -ABS(uTrans(i,j))*((1.-Cr)+uCFL*Cr)
     &                    *Rj*0.5d0
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_FLUXLIMIT_ADV_Y(
     I           bi,bj,k, calcCFL, deltaTloc,
     I           vTrans, vFld,
     I           maskLocS, tracer,
     O           vT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      LOGICAL calcCFL
      Real*8 deltaTloc
      Real*8 vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 maskLocS(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 vT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      Real*8 Cr,Rjm,Rj,Rjp
      Real*8 vCFL
C
      Real*8 Limiter
      Limiter(Cr)=max(0.d0,max(min(1.d0,2.d0*Cr),
     &                         min(2.d0,Cr))) 
      DO i=1-Olx,sNx+Olx
       vT(i,1-Oly)=0.
       vT(i,2-Oly)=0.
       vT(i,sNy+Oly)=0.
      ENDDO
      DO j=1-Oly+2,sNy+Oly-1
       DO i=1-Olx,sNx+Olx
        vCFL = vFld(i,j)
        IF ( calcCFL ) vCFL = ABS( vFld(i,j)*deltaTloc
     &                  *recip_dyC(i,j,bi,bj)*recip_deepFacC(k) )
        Rjp=(tracer(i,j+1)-tracer(i, j ))*maskLocS(i,j+1)
        Rj =(tracer(i, j )-tracer(i,j-1))*maskLocS(i, j )
        Rjm=(tracer(i,j-1)-tracer(i,j-2))*maskLocS(i,j-1)
        IF (Rj.NE.0.) THEN
         IF (vTrans(i,j).GT.0) THEN
           Cr=Rjm/Rj
         ELSE
           Cr=Rjp/Rj
         ENDIF
        ELSE
         IF (vTrans(i,j).GT.0) THEN
           Cr=Rjm*1.E20
         ELSE
           Cr=Rjp*1.E20
         ENDIF
        ENDIF
        Cr=Limiter(Cr)
        vT(i,j) =
     &   vTrans(i,j)*(Tracer(i,j)+Tracer(i,j-1))*0.5d0
     &   -ABS(vTrans(i,j))*((1.-Cr)+vCFL*Cr)
     &                    *Rj*0.5d0
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_GRAD_X(
     I           bi,bj,k,
     I           xA,
     U           tracer,
     O           dTdx,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 xA    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 dTdx  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      IF (useCubedSphereExchange) THEN
        CALL FILL_CS_CORNER_TR_RL( 1, .FALSE.,
     &                             tracer, bi,bj, myThid )
      ENDIF
      DO j=1-Oly,sNy+Oly
       dTdx(1-Olx,j)=0.
       DO i=1-Olx+1,sNx+Olx
        dTdx(i,j) = xA(i,j)
     &            *recip_dxC(i,j,bi,bj)*recip_deepFacC(k)
     &            *(tracer(i,j)-tracer(i-1,j))
     &            *sqCosFacU(j,bi,bj)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_GRAD_Y(
     I           bi,bj,k,
     I           yA,
     U           tracer,
     O           dTdy,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 yA    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 dTdy  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      IF (useCubedSphereExchange) THEN
        CALL FILL_CS_CORNER_TR_RL( 2, .FALSE.,
     &                             tracer, bi,bj, myThid )
      ENDIF
      DO i=1-Olx,sNx+Olx
       dTdy(I,1-Oly)=0.
      ENDDO
      DO j=1-Oly+1,sNy+Oly
       DO i=1-Olx,sNx+Olx
        dTdy(i,j) = yA(i,j)
     &            *recip_dyC(i,j,bi,bj)*recip_deepFacC(k)
     &            *(tracer(i,j)-tracer(i,j-1))
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_IMPLICIT_R(
     I      implicitAdvection, advectionScheme, tracerIdentity,
     I      deltaTLev,
     I      kappaRX, wVel, tracer,
     U      gTracer,
     I      bi, bj, myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      LOGICAL implicitAdvection
      INTEGER advectionScheme
      INTEGER tracerIdentity
      Real*8     deltaTLev(Nr)
      Real*8 kappaRX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 wVel   (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      Real*8 tracer (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      Real*8 gTracer(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      INTEGER bi, bj
      Real*8 myTime
      INTEGER myIter, myThid
      INTEGER iMin,iMax,jMin,jMax
      INTEGER i,j,k
      INTEGER diagonalNumber, errCode
      Real*8 a5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 b5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 c5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 d5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 e5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 wFld     (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 rTrans   (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 rTransKp1(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 localTijk(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      IF (Nr.GT.1) THEN
      iMin = 1
      jMin = 1
      iMax = sNx
      jMax = sNy
      DO k=1,Nr
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         a5d(i,j,k) = 0.d0
         b5d(i,j,k) = 0.d0
         c5d(i,j,k) = 1.d0
         d5d(i,j,k) = 0.d0
         e5d(i,j,k) = 0.d0
        ENDDO
       ENDDO
      ENDDO
      diagonalNumber = 1
      IF ( advectionScheme.EQ.ENUM_FLUX_LIMIT .OR.
     &     advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
        IF ( multiDimAdvection ) THEN
         DO k=1,Nr
          DO j=1-Oly,sNy+Oly
           DO i=1-Olx,sNx+Olx
            localTijk(i,j,k) = gTracer(i,j,k,bi,bj)
           ENDDO
          ENDDO
         ENDDO
        ELSE
         DO k=1,Nr
          DO j=1-Oly,sNy+Oly
           DO i=1-Olx,sNx+Olx
            localTijk(i,j,k) = tracer(i,j,k,bi,bj)
           ENDDO
          ENDDO
         ENDDO
        ENDIF
      ENDIF
      IF (implicitDiffusion) THEN
       diagonalNumber = 3
       DO k=2,Nr
        DO j=jMin,jMax
         DO i=iMin,iMax
           b5d(i,j,k) = -deltaTLev(k)*maskC(i,j,k-1,bi,bj)
     &                  *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
     &                  *kappaRX(i,j, k )*recip_drC( k )
         ENDDO
        ENDDO
       ENDDO
       DO k=1,Nr-1
        DO j=jMin,jMax
         DO i=iMin,iMax
           d5d(i,j,k) = -deltaTLev(k)*maskC(i,j,k+1,bi,bj)
     &                 *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
     &                 *KappaRX(i,j,k+1)*recip_drC(k+1)
         ENDDO
        ENDDO
       ENDDO
       DO k=1,Nr
        DO j=jMin,jMax
         DO i=iMin,iMax
           c5d(i,j,k) = 1.d0 - b5d(i,j,k) - d5d(i,j,k)
         ENDDO
        ENDDO
       ENDDO
      ENDIF
      IF (implicitAdvection) THEN
       DO k=Nr,1,-1
        IF (k.EQ.Nr) THEN
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
            rTransKp1(i,j) = 0.
          ENDDO
         ENDDO
        ELSE
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
            rTransKp1(i,j) = rTrans(i,j)
          ENDDO
         ENDDO
        ENDIF
        IF (k.EQ.1) THEN
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
            wFld(i,j)   = 0.d0
            rTrans(i,j) = 0.d0
          ENDDO
         ENDDO
        ELSE
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
            wFld(i,j)   = wVel(i,j,k,bi,bj)
            rTrans(i,j) = wFld(i,j)*rA(i,j,bi,bj)*maskC(i,j,k-1,bi,bj)
          ENDDO
         ENDDO
         IF (useGMRedi)
     &     CALL GMREDI_CALC_WFLOW(
     U                 wFld, rTrans,
     I                 k, bi, bj, myThid )
        ENDIF
        DO j=jMin,jMax
          DO i=iMin,iMax
           gTracer(i,j,k,bi,bj) = gTracer(i,j,k,bi,bj)
     &      + deltaTLev(1)*recip_rA(i,j,bi,bj)
     &       *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
     &       *tracer(i,j,k,bi,bj)*(rTransKp1(i,j)-rTrans(i,j))*rkSign
          ENDDO
        ENDDO
        IF ( K.GE.2 ) THEN
         IF ( advectionScheme.EQ.ENUM_CENTERED_2ND ) THEN
          diagonalNumber = 3
          CALL GAD_C2_IMPL_R( bi,bj,k, iMin,iMax,jMin,jMax,
     I                        deltaTLev, rTrans,
     U                        b5d, c5d, d5d,
     I                        myThid )
         ELSEIF ( advectionScheme.EQ.ENUM_UPWIND_1RST
     &       .OR. advectionScheme.EQ.ENUM_DST2 ) THEN
          diagonalNumber = 3
          CALL GAD_DST2U1_IMPL_R( bi,bj,k, iMin,iMax,jMin,jMax,
     I                        advectionScheme, deltaTLev, rTrans,
     U                        b5d, c5d, d5d,
     I                        myThid )
         ELSEIF ( advectionScheme.EQ.ENUM_FLUX_LIMIT ) THEN
          diagonalNumber = 3
          CALL GAD_FLUXLIMIT_IMPL_R( bi,bj,k, iMin,iMax,jMin,jMax,
     I                        deltaTLev, rTrans, localTijk,
     U                        b5d, c5d, d5d,
     I                        myThid )
         ELSEIF ( advectionScheme.EQ.ENUM_UPWIND_3RD
     &       .OR. advectionScheme.EQ.ENUM_CENTERED_4TH
     &       .OR. advectionScheme.EQ.ENUM_DST3 ) THEN
          diagonalNumber = 5
          CALL GAD_U3C4_IMPL_R( bi,bj,k, iMin,iMax,jMin,jMax,
     I                        advectionScheme, deltaTLev, rTrans,
     U                        a5d, b5d, c5d, d5d, e5d,
     I                        myThid )
         ELSEIF ( advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
          diagonalNumber = 5
          CALL GAD_DST3FL_IMPL_R( bi,bj,k, iMin,iMax,jMin,jMax,
     I                        deltaTLev, rTrans, localTijk,
     U                        a5d, b5d, c5d, d5d, e5d,
     I                        myThid )
         ELSE
          STOP 'GAD_IMPLICIT_R: Adv.Scheme in Impl form not yet coded'
         ENDIF
        ENDIF
       ENDDO
      ENDIF
      IF ( diagonalNumber .EQ. 3 ) THEN
        CALL SOLVE_TRIDIAGONAL( iMin,iMax, jMin,jMax,
     I                          b5d, c5d, d5d,
     U                          gTracer,
     O                          errCode,
     I                          bi, bj, myThid )
        IF (errCode.GE.1) THEN
          STOP 'GAD_IMPLICIT_R: error when solving 3-Diag problem'
        ENDIF
      ELSEIF ( diagonalNumber .EQ. 5 ) THEN
        CALL SOLVE_PENTADIAGONAL( iMin,iMax, jMin,jMax,
     I                            a5d, b5d, c5d, d5d, e5d,
     U                            gTracer,
     O                            errCode,
     I                            bi, bj, myThid )
        IF (errCode.GE.1) THEN
          STOP 'GAD_IMPLICIT_R: error when solving 5-Diag problem'
        ENDIF
      ELSEIF ( diagonalNumber .NE. 1 ) THEN
        STOP 'GAD_IMPLICIT_R: no solver available'
      ENDIF
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_INIT_VARIA( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER myThid
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_OS7MP_ADV_X(
     I           bi,bj,k, calcCFL, deltaTloc,
     I           uTrans, uFld,
     I           maskLocW, Q,
     O           uT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      LOGICAL calcCFL
      Real*8 deltaTloc
      Real*8 uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 maskLocW(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 Q     (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      INTEGER i,j
      Real*8 cfl,Psi
      Real*8 uLoc,Fac,DelIp,DelI,Phi,Eps,rp1h,rp1h_cfl
      Real*8 recip_DelIp, recip_DelI
      Real*8 Qippp,Qipp,Qip,Qi,Qim,Qimm,Qimmm
      Real*8 MskIpp,MskIp,MskI,MskIm,MskImm,MskImmm
      Real*8 d2,d2p1,d2m1,A,B,C,D
      Real*8 dp1h,dm1h, PhiMD,PhiLC,PhiMin,PhiMax
      Real*8 DelM,DelP,DelMM,DelPP,DelMMM,DelPPP
      Real*8 Del2MM,Del2M,Del2,Del2P,Del2PP
      Real*8 Del3MM,Del3M,Del3P,Del3PP
      Real*8 Del4M,Del4,Del4P
      Real*8 Del5M,Del5P
      Real*8 Del6
      Eps = 1.D-20
      DO j=1-Oly,sNy+Oly
       uT(1-Olx,j)=0.d0
       uT(2-Olx,j)=0.d0
       uT(3-Olx,j)=0.d0
       uT(4-Olx,j)=0.d0
       uT(sNx+Olx-2,j)=0.d0
       uT(sNx+Olx-1,j)=0.d0
       uT(sNx+Olx,j)=0.d0
      ENDDO
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx+4,sNx+Olx-3
        uLoc = uFld(i,j)
        cfl = uLoc
        IF ( calcCFL ) cfl = abs(uLoc*deltaTloc*recip_dxC(i,j,bi,bj))
        IF (uTrans(i,j).GT.0.d0) THEN
         Qippp = Q(i+2,j)
         Qipp  = Q(i+1,j)
         Qip   = Q(i,j)
         Qi    = Q(i-1,j)
         Qim   = Q(i-2,j)
         Qimm  = Q(i-3,j)
         Qimmm = Q(i-4,j)
         MskIpp  = maskLocW(i+2,j)
         MskIp   = maskLocW(i+1,j)
         MskI    = maskLocW(i,j)
         MskIm   = maskLocW(i-1,j)
         MskImm  = maskLocW(i-2,j)
         MskImmm = maskLocW(i-3,j)
        ELSEIF (uTrans(i,j).LT.0.d0) THEN
         Qippp = Q(i-3,j)
         Qipp  = Q(i-2,j)
         Qip   = Q(i-1,j)
         Qi    = Q(i,j)
         Qim   = Q(i+1,j)
         Qimm  = Q(i+2,j)
         Qimmm = Q(i+3,j)
         MskIpp  = maskLocW(i-2,j)
         MskIp   = maskLocW(i-1,j)
         MskI    = maskLocW(i,j)
         MskIm   = maskLocW(i+1,j)
         MskImm  = maskLocW(i+2,j)
         MskImmm = maskLocW(i+3,j)
        ELSE
         Qippp = 0.d0
         Qipp  = 0.d0
         Qip   = 0.d0
         Qi    = 0.d0
         Qim   = 0.d0
         Qimm  = 0.d0
         Qimmm = 0.d0
         MskIpp  = 0.d0
         MskIp   = 0.d0
         MskI    = 0.d0
         MskIm   = 0.d0
         MskImm  = 0.d0
         MskImmm = 0.d0
        ENDIF
        IF (uTrans(i,j).NE.0.d0) THEN
         Fac = 1.d0
         DelP = (Qip-Qi)*MskI
         Phi = Fac * DelP
         Fac = Fac * ( cfl + 1.d0 )/3.d0
         DelM = (Qi-Qim)*MskIm
         Del2 = DelP - DelM
         Phi = Phi - Fac * Del2
         Fac = Fac * ( cfl - 2.d0 )/4.d0
         DelPP = (Qipp-Qip)*MskIp*MskI
         Del2P = DelPP - DelP
         Del3P = Del2P - Del2
         Phi = Phi + Fac * Del3p
         Fac = Fac * ( cfl - 3.d0 )/5.d0
         DelMM = (Qim-Qimm)*MskImm*MskIm
         Del2M = DelM - DelMM
         Del3M = Del2 - Del2M
         Del4 = Del3P - Del3M
         Phi = Phi + Fac * Del4
         Fac = Fac * ( cfl + 2.d0 )/6.d0
         DelPPP = (Qippp-Qipp)*MskIpp*MskIp*MskI
         Del2PP = DelPP - DelP
         Del3PP = Del2PP - Del2P
         Del4P = Del3PP - Del3P
         Del5P = Del4P - Del4
         Phi = Phi + Fac * Del5P
         Fac = Fac * ( cfl + 2.d0 )/7.d0
         DelMMM = (Qimm-Qimmm)*MskImmm*MskImm*MskIm
         Del2MM = DelMM - DelMMM
         Del3MM = Del2M - Del2MM
         Del4M = Del3M - Del3MM
         Del5M = Del4 - Del4M
         Del6 = Del5P - Del5M
         Phi = Phi - Fac * Del6
         DelIp = ( Qip - Qi ) * MskI
         recip_DelIp = sign(1.d0,DelIp)/max(abs(DelIp),Eps)
         Phi = Phi*recip_DelIp
         DelI = ( Qi - Qim ) * MskIm
         recip_DelI = sign(1.d0,DelI)/max(abs(DelI),Eps)
         rp1h = DelI*recip_DelIp
         rp1h_cfl = rp1h/(cfl+Eps)
         d2   = Del2 !( ( Qip + Qim ) - 2.*Qi  ) * MskI * MskIm
         d2p1 = Del2P !( ( Qipp + Qi ) - 2.*Qip ) * MskIp * MskI
         d2m1 = Del2M !( ( Qi + Qimm ) - 2.*Qim ) * MskIm * MskImm
         A = 4.d0*d2 - d2p1
         B = 4.d0*d2p1 - d2
         C = d2
         D = d2p1
         dp1h = max(min(A,B,C,D),0.d0)+min(max(A,B,C,D),0.d0)
         A = 4.d0*d2m1 - d2
         B = 4.d0*d2 - d2m1
         C = d2m1
         D = d2
         dm1h = max(min(A,B,C,D),0.d0)+min(max(A,B,C,D),0.d0)
         PhiMD = 1.d0/(1.d0-cfl)*(DelIp-dp1h)*recip_DelIp
         PhiLC = rp1h_cfl*( 1.d0+dm1h*recip_DelI )
         PhiMin = max( min(0.d0,PhiMD),
     &                 min(0.d0,2.d0*rp1h_cfl,PhiLC) )
         PhiMax = min( max(2.d0/(1.d0-cfl),PhiMD),
     &                 max(0.d0,2.d0*rp1h_cfl,PhiLC) )
         Phi = max(PhiMin,min(Phi,PhiMax))
         Psi = Phi * 0.5d0 * (1.d0 - cfl)
         uT(i,j) = uTrans(i,j)*( Qi + Psi*DelIp )
        ELSE
         uT(i,j) = 0.d0
        ENDIF
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_OS7MP_ADV_Y(
     I           bi,bj,k, calcCFL, deltaTloc,
     I           vTrans, vFld,
     I           maskLocS, Q,
     O           vT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      LOGICAL calcCFL
      Real*8 deltaTloc
      Real*8 vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 maskLocS(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 Q     (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      INTEGER i,j
      Real*8 cfl,Psi
      Real*8 vLoc,Fac,DelIp,DelI,Phi,Eps,rp1h,rp1h_cfl
      Real*8 recip_DelIp, recip_DelI
      Real*8 Qippp,Qipp,Qip,Qi,Qim,Qimm,Qimmm
      Real*8 MskIpp,MskIp,MskI,MskIm,MskImm,MskImmm
      Real*8 d2,d2p1,d2m1,A,B,C,D
      Real*8 dp1h,dm1h, PhiMD,PhiLC,PhiMin,PhiMax
      Real*8 DelM,DelP,DelMM,DelPP,DelMMM,DelPPP
      Real*8 Del2MM,Del2M,Del2,Del2P,Del2PP
      Real*8 Del3MM,Del3M,Del3P,Del3PP
      Real*8 Del4M,Del4,Del4P
      Real*8 Del5M,Del5P
      Real*8 Del6
      Eps = 1.D-20
      DO i=1-Olx,sNx+Olx
       vT(i,1-Oly)=0.d0
       vT(i,2-Oly)=0.d0
       vT(i,3-Oly)=0.d0
       vT(i,4-Oly)=0.d0
       vT(i,sNy+Oly-2)=0.d0
       vT(i,sNy+Oly-1)=0.d0
       vT(i,sNy+Oly)=0.d0
      ENDDO
      DO j=1-Oly+4,sNy+Oly-3
       DO i=1-Olx,sNx+Olx
        vLoc = vFld(i,j)
        cfl = vLoc
        IF ( calcCFL ) cfl = abs(vLoc*deltaTloc*recip_dyC(i,j,bi,bj))
        IF (vTrans(i,j).GT.0.d0) THEN
         Qippp = Q(i,j+2)
         Qipp  = Q(i,j+1)
         Qip   = Q(i,j)
         Qi    = Q(i,j-1)
         Qim   = Q(i,j-2)
         Qimm  = Q(i,j-3)
         Qimmm = Q(i,j-4)
         MskIpp  = maskLocS(i,j+2)
         MskIp   = maskLocS(i,j+1)
         MskI    = maskLocS(i,j)
         MskIm   = maskLocS(i,j-1)
         MskImm  = maskLocS(i,j-2)
         MskImmm = maskLocS(i,j-3)
        ELSEIF (vTrans(i,j).LT.0.d0) THEN
         Qippp = Q(i,j-3)
         Qipp  = Q(i,j-2)
         Qip   = Q(i,j-1)
         Qi    = Q(i,j)
         Qim   = Q(i,j+1)
         Qimm  = Q(i,j+2)
         Qimmm = Q(i,j+3)
         MskIpp  = maskLocS(i,j-2)
         MskIp   = maskLocS(i,j-1)
         MskI    = maskLocS(i,j)
         MskIm   = maskLocS(i,j+1)
         MskImm  = maskLocS(i,j+2)
         MskImmm = maskLocS(i,j+3)
        ELSE
         Qippp = 0.d0
         Qipp  = 0.d0
         Qip   = 0.d0
         Qi    = 0.d0
         Qim   = 0.d0
         Qimm  = 0.d0
         Qimmm = 0.d0
         MskIpp  = 0.d0
         MskIp   = 0.d0
         MskI    = 0.d0
         MskIm   = 0.d0
         MskImm  = 0.d0
         MskImmm = 0.d0
        ENDIF
        IF (vTrans(i,j).NE.0.d0) THEN
         Fac = 1.d0
         DelP = (Qip-Qi)*MskI
         Phi = Fac * DelP
         Fac = Fac * ( cfl + 1.d0 )/3.d0
         DelM = (Qi-Qim)*MskIm
         Del2 = DelP - DelM
         Phi = Phi - Fac * Del2
         Fac = Fac * ( cfl - 2.d0 )/4.d0
         DelPP = (Qipp-Qip)*MskIp*MskI
         Del2P = DelPP - DelP
         Del3P = Del2P - Del2
         Phi = Phi + Fac * Del3p
         Fac = Fac * ( cfl - 3.d0 )/5.d0
         DelMM = (Qim-Qimm)*MskImm*MskIm
         Del2M = DelM - DelMM
         Del3M = Del2 - Del2M
         Del4 = Del3P - Del3M
         Phi = Phi + Fac * Del4
         Fac = Fac * ( cfl + 2.d0 )/6.d0
         DelPPP = (Qippp-Qipp)*MskIpp*MskIp*MskI
         Del2PP = DelPP - DelP
         Del3PP = Del2PP - Del2P
         Del4P = Del3PP - Del3P
         Del5P = Del4P - Del4
         Phi = Phi + Fac * Del5P
         Fac = Fac * ( cfl + 2.d0 )/7.d0
         DelMMM = (Qimm-Qimmm)*MskImmm*MskImm*MskIm
         Del2MM = DelMM - DelMMM
         Del3MM = Del2M - Del2MM
         Del4M = Del3M - Del3MM
         Del5M = Del4 - Del4M
         Del6 = Del5P - Del5M
         Phi = Phi - Fac * Del6
         DelIp = ( Qip - Qi ) * MskI
         recip_DelIp = sign(1.d0,DelIp)/max(abs(DelIp),Eps)
         Phi = Phi*recip_DelIp
         DelI = ( Qi - Qim ) * MskIm
         recip_DelI = sign(1.d0,DelI)/max(abs(DelI),Eps)
         rp1h = DelI*recip_DelIp
         rp1h_cfl = rp1h/(cfl+Eps)
         d2   = Del2 !( ( Qip + Qim ) - 2.*Qi  ) * MskI * MskIm
         d2p1 = Del2P !( ( Qipp + Qi ) - 2.*Qip ) * MskIp * MskI
         d2m1 = Del2M !( ( Qi + Qimm ) - 2.*Qim ) * MskIm * MskImm
         A = 4.d0*d2 - d2p1
         B = 4.d0*d2p1 - d2
         C = d2
         D = d2p1
         dp1h = max(min(A,B,C,D),0.d0)+min(max(A,B,C,D),0.d0)
         A = 4.d0*d2m1 - d2
         B = 4.d0*d2 - d2m1
         C = d2m1
         D = d2
         dm1h = max(min(A,B,C,D),0.d0)+min(max(A,B,C,D),0.d0)
         PhiMD = 1.d0/(1.d0-cfl)*(DelIp-dp1h)*recip_DelIp
         PhiLC = rp1h_cfl*( 1.d0+dm1h*recip_DelI )
         PhiMin = max( min(0.d0,PhiMD),
     &                 min(0.d0,2.d0*rp1h_cfl,PhiLC) )
         PhiMax = min( max(2.d0/(1.d0-cfl),PhiMD),
     &                 max(0.d0,2.d0*rp1h_cfl,PhiLC) )
         Phi = max(PhiMin,min(Phi,PhiMax))
         Psi = Phi * 0.5d0 * (1.d0 - cfl)
         vT(i,j) = vTrans(i,j)*( Qi + Psi*DelIp )
        ELSE
         vT(i,j) = 0.d0
        ENDIF
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_OS7MP_ADV_R(
     I           bi,bj,k,deltaTloc,
     I           wTrans, wFld,
     I           Q,
     O           wT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      Real*8 deltaTloc
      Real*8 wTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 wFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 Q     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 wT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      INTEGER i,j,kp3,kp2,kp1,km1,km2,km3,km4
      Real*8 cfl,Psi
      Real*8 wLoc,Fac,DelIp,DelI,Phi,Eps,rp1h,rp1h_cfl
      Real*8 recip_DelIp, recip_DelI
      Real*8 Qippp,Qipp,Qip,Qi,Qim,Qimm,Qimmm
      Real*8 MskIpp,MskIp,MskI,MskIm,MskImm,MskImmm
      Real*8 d2,d2p1,d2m1,A,B,C,D
      Real*8 dp1h,dm1h, PhiMD,PhiLC,PhiMin,PhiMax
      Real*8 DelM,DelP,DelMM,DelPP,DelMMM,DelPPP
      Real*8 Del2MM,Del2M,Del2,Del2P,Del2PP
      Real*8 Del3MM,Del3M,Del3P,Del3PP
      Real*8 Del4M,Del4,Del4P
      Real*8 Del5M,Del5P
      Real*8 Del6
      Eps = 1.D-20
      km4=MAX(1,k-4)
      km3=MAX(1,k-3)
      km2=MAX(1,k-2)
      km1=MAX(1,k-1)
      kp1=MIN(Nr,k+1)
      kp2=MIN(Nr,k+2)
      kp3=MIN(Nr,k+3)
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
        wLoc = wFld(i,j)
        cfl = abs(wLoc*deltaTloc*recip_drC(k))
        IF (wTrans(i,j).LT.0.d0) THEN
         Qippp = Q(i,j,kp2)
         Qipp  = Q(i,j,kp1)
         Qip   = Q(i,j,k)
         Qi    = Q(i,j,km1)
         Qim   = Q(i,j,km2)
         Qimm  = Q(i,j,km3)
         Qimmm = Q(i,j,km4)
         MskIpp  = maskC(i,j,kp2,bi,bj) * float(kp2-kp1)
         MskIp   = maskC(i,j,kp1,bi,bj) * float(kp1-k)
         MskI    = maskC(i,j,k,bi,bj)   * float(k-km1)
         MskIm   = maskC(i,j,km1,bi,bj) * float(km1-km2)
         MskImm  = maskC(i,j,km2,bi,bj) * float(km2-km3)
         MskImmm = maskC(i,j,km3,bi,bj) * float(km3-km4)
        ELSEIF (wTrans(i,j).GT.0.d0) THEN
         Qippp = Q(i,j,km3)
         Qipp  = Q(i,j,km2)
         Qip   = Q(i,j,km1)
         Qi    = Q(i,j,k)
         Qim   = Q(i,j,kp1)
         Qimm  = Q(i,j,kp2)
         Qimmm = Q(i,j,kp3)
         MskIpp  = maskC(i,j,km2,bi,bj) * float(km2-km3)
         MskIp   = maskC(i,j,km1,bi,bj) * float(km1-km2)
         MskI    = maskC(i,j,k,bi,bj)   * float(k-km1)
         MskIm   = maskC(i,j,kp1,bi,bj) * float(kp1-k)
         MskImm  = maskC(i,j,kp2,bi,bj) * float(kp2-kp1)
         MskImmm = maskC(i,j,kp3,bi,bj) * float(kp3-kp2)
        ELSE
         Qippp = 0.d0
         Qipp  = 0.d0
         Qip   = 0.d0
         Qi    = 0.d0
         Qim   = 0.d0
         Qimm  = 0.d0
         Qimmm = 0.d0
         MskIpp  = 0.d0
         MskIp   = 0.d0
         MskI    = 0.d0
         MskIm   = 0.d0
         MskImm  = 0.d0
         MskImmm = 0.d0
        ENDIF
        IF (wTrans(i,j).NE.0.d0) THEN
         Fac = 1.d0
         DelP = (Qip-Qi)*MskI
         Phi = Fac * DelP
         Fac = Fac * ( cfl + 1.d0 )/3.d0
         DelM = (Qi-Qim)*MskIm
         Del2 = DelP - DelM
         Phi = Phi - Fac * Del2
         Fac = Fac * ( cfl - 2.d0 )/4.d0
         DelPP = (Qipp-Qip)*MskIp*MskI
         Del2P = DelPP - DelP
         Del3P = Del2P - Del2
         Phi = Phi + Fac * Del3p
         Fac = Fac * ( cfl - 3.d0 )/5.d0
         DelMM = (Qim-Qimm)*MskImm*MskIm
         Del2M = DelM - DelMM
         Del3M = Del2 - Del2M
         Del4 = Del3P - Del3M
         Phi = Phi + Fac * Del4
         Fac = Fac * ( cfl + 2.d0 )/6.d0
         DelPPP = (Qippp-Qipp)*MskIpp*MskIp*MskI
         Del2PP = DelPP - DelP
         Del3PP = Del2PP - Del2P
         Del4P = Del3PP - Del3P
         Del5P = Del4P - Del4
         Phi = Phi + Fac * Del5P
         Fac = Fac * ( cfl + 2.d0 )/7.d0
         DelMMM = (Qimm-Qimmm)*MskImmm*MskImm*MskIm
         Del2MM = DelMM - DelMMM
         Del3MM = Del2M - Del2MM
         Del4M = Del3M - Del3MM
         Del5M = Del4 - Del4M
         Del6 = Del5P - Del5M
         Phi = Phi - Fac * Del6
         DelIp = ( Qip - Qi ) * MskI
         recip_DelIp = sign(1.d0,DelIp)/max(abs(DelIp),Eps)
         Phi = Phi*recip_DelIp
         DelI = ( Qi - Qim ) * MskIm
         recip_DelI = sign(1.d0,DelI)/max(abs(DelI),Eps)
         rp1h = DelI*recip_DelIp
         rp1h_cfl = rp1h/(cfl+Eps)
         d2   = Del2 !( ( Qip + Qim ) - 2.*Qi  ) * MskI * MskIm
         d2p1 = Del2P !( ( Qipp + Qi ) - 2.*Qip ) * MskIp * MskI
         d2m1 = Del2M !( ( Qi + Qimm ) - 2.*Qim ) * MskIm * MskImm
         A = 4.d0*d2 - d2p1
         B = 4.d0*d2p1 - d2
         C = d2
         D = d2p1
         dp1h = max(min(A,B,C,D),0.d0)+min(max(A,B,C,D),0.d0)
         A = 4.d0*d2m1 - d2
         B = 4.d0*d2 - d2m1
         C = d2m1
         D = d2
         dm1h = max(min(A,B,C,D),0.d0)+min(max(A,B,C,D),0.d0)
         PhiMD = 1.d0/(1.d0-cfl)*(DelIp-dp1h)*recip_DelIp
         PhiLC = rp1h_cfl*( 1.d0+dm1h*recip_DelI )
         PhiMin = max(min(0.d0,PhiMD),
     &        min(0.d0,2.d0*rp1h_cfl,PhiLC))
         PhiMax = min(max(2.d0/(1.d0-cfl),PhiMD),
     &        max(0.d0,2.d0*rp1h_cfl,PhiLC))
         Phi = max(PhiMin,min(Phi,PhiMax))
         Psi = Phi * 0.5d0 * (1.d0 - cfl)
         wT(i,j) = wTrans(i,j)*( Qi + Psi*DelIp )
        ELSE
         wT(i,j) = 0.d0
        ENDIF
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_U3_ADV_R( 
     I           bi,bj,k,
     I           rTrans,
     I           tracer,
     O           wT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      Real*8 rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      Real*8 wT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j,kp1,km1,km2
      Real*8 Rjm,Rj,Rjp,Rjjm,Rjjp
      km2=MAX(1,k-2)
      km1=MAX(1,k-1)
      kp1=MIN(Nr,k+1)
      IF ( k.EQ.1 .OR. k.GT.Nr ) THEN
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         wT(i,j) = 0.
        ENDDO
       ENDDO
      ELSE
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         Rjp=(tracer(i,j,kp1,bi,bj)-tracer(i,j,k,bi,bj))
     &        *maskC(i,j,kp1,bi,bj)
         Rj=(tracer(i,j,k,bi,bj)-tracer(i,j,km1,bi,bj))
         Rjm=(tracer(i,j,km1,bi,bj)-tracer(i,j,km2,bi,bj))
     &        *maskC(i,j,km2,bi,bj)
         Rjjp=Rjp-Rj
         Rjjm=Rj-Rjm
         wT(i,j) = maskC(i,j,km1,bi,bj)*(
     &     rTrans(i,j)*(
     &        (Tracer(i,j,k,bi,bj)+Tracer(i,j,km1,bi,bj))*0.5d0
     &        -oneSixth*(Rjjm+Rjjp)*0.5d0  )
     &    +ABS(rTrans(i,j))*
     &         oneSixth*(Rjjm-Rjjp)*0.5d0
     &                                  )
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_U3C4_IMPL_R(
     I           bi,bj,k, iMin,iMax,jMin,jMax,
     I           advectionScheme, deltaTarg, rTrans,
     O           a5d, b5d, c5d, d5d, e5d,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      INTEGER iMin,iMax,jMin,jMax
      INTEGER advectionScheme
      Real*8 deltaTarg(Nr)
      Real*8 rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 a5d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 b5d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 c5d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 d5d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 e5d   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      INTEGER myThid
      LOGICAL flagC4
      INTEGER i,j,kp1,km2
      Real*8 wCFL, rCenter, rUpwind
      Real*8 rC4km, rC4kp, rHigh
      Real*8 mskM, mskP, maskM2, maskP1
      Real*8 deltaTcfl
      IF ( k.GT.1 .AND. k.LE.Nr ) THEN
      km2=MAX(1,k-2)
      kp1=MIN(Nr,k+1)
      maskP1 = 1.d0
      maskM2 = 1.d0
      IF ( k.LE.2 ) maskM2 = 0.d0
      IF ( k.GE.Nr) maskP1 = 0.d0
      flagC4 = advectionScheme.EQ.ENUM_CENTERED_4TH
     &         .AND. k.GT.2 .AND. k.LT.Nr
       deltaTcfl = deltaTarg(k)
       DO j=jMin,jMax
         DO i=iMin,iMax
           rCenter= 0.5d0 *rTrans(i,j)*recip_rA(i,j,bi,bj)*rkSign
           mskM   = maskC(i,j,km2,bi,bj)*maskM2
           mskP   = maskC(i,j,kp1,bi,bj)*maskP1
           IF ( flagC4 .AND. mskM*mskP.GT.0.d0 ) THEN
            rUpwind= 0.d0
            rC4km  = oneSixth*rCenter*mskM
            rC4kp  = oneSixth*rCenter*mskP
           ELSEIF ( advectionScheme.EQ.ENUM_DST3 ) THEN
            wCFL = deltaTcfl*ABS(rTrans(i,j))
     &            *recip_rA(i,j,bi,bj)*recip_drC(k)
            rHigh  = (1.d0 -wCFL*wCFL)*oneSixth
            rUpwind= (2.d0*rHigh )*ABS(rCenter)
            rC4km  =  rHigh * (rCenter+ABS(rCenter))*mskM
            rC4kp  =  rHigh * (rCenter-ABS(rCenter))*mskP
           ELSE
            rUpwind=  2.d0*oneSixth*ABS(rCenter)
            rC4km  = oneSixth*(rCenter+ABS(rCenter))*mskM
            rC4kp  = oneSixth*(rCenter-ABS(rCenter))*mskP
           ENDIF
           a5d(i,j,k)   = a5d(i,j,k)
     &                  + rC4km
     &                   *deltaTarg(k)
     &                   *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
           b5d(i,j,k)   = b5d(i,j,k)
     &                  - ( (rCenter+rUpwind) + rC4km )
     &                   *deltaTarg(k)
     &                   *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
           c5d(i,j,k)   = c5d(i,j,k)
     &                  - ( (rCenter-rUpwind) + rC4kp )
     &                   *deltaTarg(k)
     &                    *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
           d5d(i,j,k)   = d5d(i,j,k)
     &                  + rC4kp
     &                   *deltaTarg(k)
     &                   *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
           b5d(i,j,k-1) = b5d(i,j,k-1)
     &                  - rC4km
     &                   *deltaTarg(k-1)
     &                   *recip_hFacC(i,j,k-1,bi,bj)*recip_drF(k-1)
           c5d(i,j,k-1) = c5d(i,j,k-1)
     &                  + ( (rCenter+rUpwind) + rC4km )
     &                   *deltaTarg(k-1)
     &                   *recip_hFacC(i,j,k-1,bi,bj)*recip_drF(k-1)
           d5d(i,j,k-1) = d5d(i,j,k-1)
     &                  + ( (rCenter-rUpwind) + rC4kp )
     &                   *deltaTarg(k-1)
     &                   *recip_hFacC(i,j,k-1,bi,bj)*recip_drF(k-1)
           e5d(i,j,k-1) = e5d(i,j,k-1)
     &                  - rC4kp
     &                   *deltaTarg(k-1)
     &                   *recip_hFacC(i,j,k-1,bi,bj)*recip_drF(k-1)
         ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_U3_ADV_X( 
     I           bi,bj,k,
     I           uTrans,
     I           tracer,
     O           uT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      Real*8 uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 uT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      Real*8 Rjm,Rj,Rjp,Rjjm,Rjjp
      DO j=1-Oly,sNy+Oly
       uT(1-Olx,j)=0.
       uT(2-Olx,j)=0.
       uT(sNx+Olx,j)=0.
      ENDDO
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx+2,sNx+Olx-1
        Rjp=(tracer(i+1,j)-tracer(i,j))*maskW(i+1,j,k,bi,bj)
        Rj =(tracer(i,j)-tracer(i-1,j))*maskW(i,j,k,bi,bj)
        Rjm=(tracer(i-1,j)-tracer(i-2,j))*maskW(i-1,j,k,bi,bj)
        Rjjp=Rjp-Rj
        Rjjm=Rj-Rjm
        uT(i,j) = 
     &   uTrans(i,j)*(
     &     Tracer(i,j)+Tracer(i-1,j)-oneSixth*( Rjjp+Rjjm )
     &               )*0.5d0
     &  +ABS( uTrans(i,j) )*0.5d0*oneSixth*( Rjjp-Rjjm )
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_U3_ADV_Y( 
     I           bi,bj,k,
     I           vTrans,
     I           tracer,
     O           vT,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,k
      Real*8 vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 vT    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      Real*8 Rjm,Rj,Rjp,Rjjm,Rjjp
      DO i=1-Olx,sNx+Olx
       vT(i,1-Oly)=0.
       vT(i,2-Oly)=0.
       vT(i,sNy+Oly)=0.
      ENDDO
      DO j=1-Oly+2,sNy+Oly-1
       DO i=1-Olx,sNx+Olx
        Rjp=(tracer(i,j+1)-tracer(i,j))*maskS(i,j+1,k,bi,bj)
        Rj =(tracer(i,j)-tracer(i,j-1))*maskS(i,j,k,bi,bj)
        Rjm=(tracer(i,j-1)-tracer(i,j-2))*maskS(i,j-1,k,bi,bj)
        Rjjp=Rjp-Rj
        Rjjm=Rj-Rjm
        vT(i,j) = 
     &   vTrans(i,j)*(
     &     Tracer(i,j)+Tracer(i,j-1)-oneSixth*( Rjjp+Rjjm )
     &               )*0.5d0
     &  +ABS( vTrans(i,j) )*0.5d0*oneSixth*( Rjjp-Rjjm )
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
      SUBROUTINE GAD_SOM_EXCHANGES( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER myThid
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
 
      SUBROUTINE GMREDI_CALC_DIFF( 
     I        bi,bj,iMin,iMax,jMin,jMax,kArg,kSize,
     U        KappaRx,
     I        tracerIdentity,myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      Real*8 op5
      Real*8 op25
      PARAMETER( op5  = 0.5 D 0 )
      PARAMETER( op25 = 0.25 D 0 )
      LOGICAL GM_AdvForm
      LOGICAL GM_AdvSeparate
      LOGICAL GM_ExtraDiag
      LOGICAL GM_InMomAsStress
      LOGICAL GM_MNC
      LOGICAL GM_MDSIO
      COMMON /GM_PARAMS_L/
     &                   GM_AdvForm, GM_AdvSeparate,
     &                   GM_ExtraDiag, GM_MNC, GM_MDSIO,
     &                   GM_InMomAsStress
      CHARACTER*(40) GM_taper_scheme
      COMMON /GM_PARAMS_C/
     &                   GM_taper_scheme
      Real*8 GM_isopycK
      Real*8 GM_background_K
      Real*8 GM_maxSlope
      Real*8 GM_Kmin_horiz
      Real*8 GM_Small_Number
      Real*8 GM_slopeSqCutoff
      Real*8 GM_Visbeck_alpha
      Real*8 GM_Visbeck_length
      Real*8 GM_Visbeck_depth
      Real*8 GM_Visbeck_minDepth
      Real*8 GM_Visbeck_maxSlope
      Real*8 GM_Visbeck_minVal_K
      Real*8 GM_Visbeck_maxVal_K
      Real*8 GM_facTrL2dz
      Real*8 GM_facTrL2ML
      Real*8 GM_maxTransLay
      Real*8 GM_Scrit
      Real*8 GM_Sd
      COMMON /GM_PARAMS_R/
     &                   GM_isopycK, GM_background_K,
     &                   GM_maxSlope,
     &                   GM_Kmin_horiz,
     &                   GM_Small_Number, GM_slopeSqCutoff,
     &                   GM_Visbeck_alpha, GM_Visbeck_length,
     &                   GM_Visbeck_depth,
     &                   GM_Visbeck_minDepth, GM_Visbeck_maxSlope,
     &                   GM_Visbeck_minVal_K, GM_Visbeck_maxVal_K,
     &                   GM_facTrL2dz, GM_facTrL2ML, GM_maxTransLay,
     &                   GM_Scrit, GM_Sd
      Real*8 GM_rMaxSlope
      Real*8 GM_skewflx
      Real*8 GM_advect
      COMMON /GM_DERIVED_PAR/
     &                   GM_rMaxSlope,
     &                   GM_skewflx, GM_advect
      Real*8 Kwx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_Wtensor/ Kwx,Kwy,Kwz
      Real*8 Kux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_HorTensor/ Kux,Kvy
      Real*8 Kuz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_UVtensor/ Kuz,Kvz
C
      INTEGER bi,bj,iMin,iMax,jMin,jMax,kArg,kSize
      Real*8 KappaRx(1-Olx:sNx+Olx,1-Oly:sNy+Oly,kSize)
      INTEGER tracerIdentity
      INTEGER myThid
      INTEGER i,j,k
      IF ( kArg .EQ. 0 ) THEN
        DO k=1,MIN(Nr,kSize)
         DO j=jMin,jMax
          DO i=iMin,iMax
           IF (tracerIdentity .LT. GAD_TR1) THEN
            KappaRx(i,j,k) = KappaRx(i,j,k)+Kwz(i,j,k,bi,bj)
           ELSE
            KappaRx(i,j,k) = KappaRx(i,j,k)+Kwz(i,j,k,bi,bj)
           ENDIF
          ENDDO
         ENDDO
        ENDDO
      ELSE
         k = MIN(kArg,kSize)
         DO j=jMin,jMax
          DO i=iMin,iMax
           IF (tracerIdentity .LT. GAD_TR1) THEN
            KappaRx(i,j,k) = KappaRx(i,j,k)+Kwz(i,j,kArg,bi,bj)
           ELSE
            KappaRx(i,j,k) = KappaRx(i,j,k)+Kwz(i,j,kArg,bi,bj)
           ENDIF
          ENDDO
         ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
 
CStartOfInterface
      SUBROUTINE GMREDI_CALC_PSI_B(
     I             bi, bj, iMin, iMax, jMin, jMax,
     I             sigmaX, sigmaY, sigmaR,
     I             ldd97_LrhoW, ldd97_LrhoS,
     I             myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      Real*8 op5
      Real*8 op25
      PARAMETER( op5  = 0.5 D 0 )
      PARAMETER( op25 = 0.25 D 0 )
      LOGICAL GM_AdvForm
      LOGICAL GM_AdvSeparate
      LOGICAL GM_ExtraDiag
      LOGICAL GM_InMomAsStress
      LOGICAL GM_MNC
      LOGICAL GM_MDSIO
      COMMON /GM_PARAMS_L/
     &                   GM_AdvForm, GM_AdvSeparate,
     &                   GM_ExtraDiag, GM_MNC, GM_MDSIO,
     &                   GM_InMomAsStress
      CHARACTER*(40) GM_taper_scheme
      COMMON /GM_PARAMS_C/
     &                   GM_taper_scheme
      Real*8 GM_isopycK
      Real*8 GM_background_K
      Real*8 GM_maxSlope
      Real*8 GM_Kmin_horiz
      Real*8 GM_Small_Number
      Real*8 GM_slopeSqCutoff
      Real*8 GM_Visbeck_alpha
      Real*8 GM_Visbeck_length
      Real*8 GM_Visbeck_depth
      Real*8 GM_Visbeck_minDepth
      Real*8 GM_Visbeck_maxSlope
      Real*8 GM_Visbeck_minVal_K
      Real*8 GM_Visbeck_maxVal_K
      Real*8 GM_facTrL2dz
      Real*8 GM_facTrL2ML
      Real*8 GM_maxTransLay
      Real*8 GM_Scrit
      Real*8 GM_Sd
      COMMON /GM_PARAMS_R/
     &                   GM_isopycK, GM_background_K,
     &                   GM_maxSlope,
     &                   GM_Kmin_horiz,
     &                   GM_Small_Number, GM_slopeSqCutoff,
     &                   GM_Visbeck_alpha, GM_Visbeck_length,
     &                   GM_Visbeck_depth,
     &                   GM_Visbeck_minDepth, GM_Visbeck_maxSlope,
     &                   GM_Visbeck_minVal_K, GM_Visbeck_maxVal_K,
     &                   GM_facTrL2dz, GM_facTrL2ML, GM_maxTransLay,
     &                   GM_Scrit, GM_Sd
      Real*8 GM_rMaxSlope
      Real*8 GM_skewflx
      Real*8 GM_advect
      COMMON /GM_DERIVED_PAR/
     &                   GM_rMaxSlope,
     &                   GM_skewflx, GM_advect
      Real*8 Kwx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_Wtensor/ Kwx,Kwy,Kwz
      Real*8 Kux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_HorTensor/ Kux,Kvy
      Real*8 Kuz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_UVtensor/ Kuz,Kvz
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
C
      Real*8 sigmaX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 sigmaY(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 sigmaR(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 ldd97_LrhoW(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 ldd97_LrhoS(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      INTEGER bi,bj,iMin,iMax,jMin,jMax
      INTEGER myThid
CEndOfInterface
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
 
      SUBROUTINE GMREDI_CALC_TENSOR(
     I             iMin, iMax, jMin, jMax,
     I             sigmaX, sigmaY, sigmaR,
     I             bi, bj, myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      Real*8 op5
      Real*8 op25
      PARAMETER( op5  = 0.5 D 0 )
      PARAMETER( op25 = 0.25 D 0 )
      LOGICAL GM_AdvForm
      LOGICAL GM_AdvSeparate
      LOGICAL GM_ExtraDiag
      LOGICAL GM_InMomAsStress
      LOGICAL GM_MNC
      LOGICAL GM_MDSIO
      COMMON /GM_PARAMS_L/
     &                   GM_AdvForm, GM_AdvSeparate,
     &                   GM_ExtraDiag, GM_MNC, GM_MDSIO,
     &                   GM_InMomAsStress
      CHARACTER*(40) GM_taper_scheme
      COMMON /GM_PARAMS_C/
     &                   GM_taper_scheme
      Real*8 GM_isopycK
      Real*8 GM_background_K
      Real*8 GM_maxSlope
      Real*8 GM_Kmin_horiz
      Real*8 GM_Small_Number
      Real*8 GM_slopeSqCutoff
      Real*8 GM_Visbeck_alpha
      Real*8 GM_Visbeck_length
      Real*8 GM_Visbeck_depth
      Real*8 GM_Visbeck_minDepth
      Real*8 GM_Visbeck_maxSlope
      Real*8 GM_Visbeck_minVal_K
      Real*8 GM_Visbeck_maxVal_K
      Real*8 GM_facTrL2dz
      Real*8 GM_facTrL2ML
      Real*8 GM_maxTransLay
      Real*8 GM_Scrit
      Real*8 GM_Sd
      COMMON /GM_PARAMS_R/
     &                   GM_isopycK, GM_background_K,
     &                   GM_maxSlope,
     &                   GM_Kmin_horiz,
     &                   GM_Small_Number, GM_slopeSqCutoff,
     &                   GM_Visbeck_alpha, GM_Visbeck_length,
     &                   GM_Visbeck_depth,
     &                   GM_Visbeck_minDepth, GM_Visbeck_maxSlope,
     &                   GM_Visbeck_minVal_K, GM_Visbeck_maxVal_K,
     &                   GM_facTrL2dz, GM_facTrL2ML, GM_maxTransLay,
     &                   GM_Scrit, GM_Sd
      Real*8 GM_rMaxSlope
      Real*8 GM_skewflx
      Real*8 GM_advect
      COMMON /GM_DERIVED_PAR/
     &                   GM_rMaxSlope,
     &                   GM_skewflx, GM_advect
      Real*8 Kwx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_Wtensor/ Kwx,Kwy,Kwz
      Real*8 Kux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_HorTensor/ Kux,Kvy
      Real*8 Kuz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_UVtensor/ Kuz,Kvz
      Real*8 GM_timeAve  (nSx,nSy)
      Real*8 GM_Kwx_T    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 GM_Kwy_T    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 GM_Kwz_T    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_TAVE_VARS/
     &                       GM_timeAve,
     &                       GM_Kwx_T,
     &                       GM_Kwy_T,
     &                       GM_Kwz_T
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
C
      INTEGER iMin,iMax,jMin,jMax
      Real*8 sigmaX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 sigmaY(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 sigmaR(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      INTEGER bi, bj
      Real*8     myTime
      INTEGER myIter
      INTEGER myThid
      INTEGER i,j,k
      Real*8 SlopeX(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 SlopeY(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 dSigmaDx(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 dSigmaDy(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 dSigmaDr(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 SlopeSqr(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 taperFct(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 Kgm_tmp
      Real*8 ldd97_LrhoC(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 ldd97_LrhoW(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 ldd97_LrhoS(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 Cspd, LrhoInf, LrhoSup, fCoriLoc
      INTEGER kLow_W (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      INTEGER kLow_S (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 locMixLayer(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 baseSlope  (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 hTransLay  (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 recipLambda(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      INTEGER kp1
      Real*8 maskp1
          act1 = bi - myBxLo(myThid)
          max1 = myBxHi(myThid) - myBxLo(myThid) + 1
          act2 = bj - myByLo(myThid)
          max2 = myByHi(myThid) - myByLo(myThid) + 1
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = ikey_dynamics - 1
          igmkey = (act1 + 1) + act2*max1
     &                      + act3*max1*max2
     &                      + act4*max1*max2*max3
      IF ( GM_taper_scheme.EQ.'ldd97' .OR.
     &     GM_taper_scheme.EQ.'fm07' ) THEN
       Cspd = 2.d0
       LrhoInf = 15.D3
       LrhoSup = 100.D3
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         IF (fCori(i,j,bi,bj).NE.0.) THEN
           ldd97_LrhoC(i,j) = Cspd/ABS(fCori(i,j,bi,bj))
         ELSE
           ldd97_LrhoC(i,j) = LrhoSup
         ENDIF
         ldd97_LrhoC(i,j) = MAX(LrhoInf,MIN(ldd97_LrhoC(i,j),LrhoSup))
        ENDDO
       ENDDO
       DO j=1-Oly,sNy+Oly
        kLow_W(1-Olx,j) = 0
        ldd97_LrhoW(1-Olx,j) = LrhoSup
        DO i=1-Olx+1,sNx+Olx
         kLow_W(i,j) = MIN(kLowC(i-1,j,bi,bj),kLowC(i,j,bi,bj))
         fCoriLoc = op5*(fCori(i-1,j,bi,bj)+fCori(i,j,bi,bj))
         IF (fCoriLoc.NE.0.) THEN
           ldd97_LrhoW(i,j) = Cspd/ABS(fCoriLoc)
         ELSE
           ldd97_LrhoW(i,j) = LrhoSup
         ENDIF
         ldd97_LrhoW(i,j) = MAX(LrhoInf,MIN(ldd97_LrhoW(i,j),LrhoSup))
        ENDDO
       ENDDO
       DO i=1-Olx+1,sNx+Olx
         kLow_S(i,1-Oly) = 0
         ldd97_LrhoS(i,1-Oly) = LrhoSup
       ENDDO
       DO j=1-Oly+1,sNy+Oly
        DO i=1-Olx,sNx+Olx
         kLow_S(i,j) = MIN(kLowC(i,j-1,bi,bj),kLowC(i,j,bi,bj))
         fCoriLoc = op5*(fCori(i,j-1,bi,bj)+fCori(i,j,bi,bj))
         IF (fCoriLoc.NE.0.) THEN
           ldd97_LrhoS(i,j) = Cspd/ABS(fCoriLoc)
         ELSE
           ldd97_LrhoS(i,j) = LrhoSup
         ENDIF
         ldd97_LrhoS(i,j) = MAX(LrhoInf,MIN(ldd97_LrhoS(i,j),LrhoSup))
        ENDDO
       ENDDO
      ELSE
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
          ldd97_LrhoC(i,j) = 0.d0
          ldd97_LrhoW(i,j) = 0.d0
          ldd97_LrhoS(i,j) = 0.d0
        ENDDO
       ENDDO
      ENDIF
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
         hTransLay(i,j) = R_low(i,j,bi,bj)
         baseSlope(i,j) =  0.d0
         recipLambda(i,j) = 0.d0
         locMixLayer(i,j) = 0.d0
       ENDDO
      ENDDO
      IF ( .TRUE. ) THEN
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         locMixLayer(i,j) = hMixLayer(i,j,bi,bj)
        ENDDO
       ENDDO
      ENDIF
      DO k=Nr,2,-1
       kkey = (igmkey-1)*Nr + k
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         SlopeX(i,j)       = 0.d0
         SlopeY(i,j)       = 0.d0
         dSigmaDx(i,j)     = 0.d0
         dSigmaDy(i,j)     = 0.d0
         dSigmaDr(i,j)     = 0.d0
         SlopeSqr(i,j)     = 0.d0
         taperFct(i,j)     = 0.d0
         Kwx(i,j,k,bi,bj)  = 0.d0
         Kwy(i,j,k,bi,bj)  = 0.d0
         Kwz(i,j,k,bi,bj)  = 0.d0
         Kux(i,j,k,bi,bj)  = 0.d0
         Kvy(i,j,k,bi,bj)  = 0.d0
         Kuz(i,j,k,bi,bj)  = 0.d0
         Kvz(i,j,k,bi,bj)  = 0.d0
        ENDDO
       ENDDO
       DO j=1-Oly+1,sNy+Oly-1
        DO i=1-Olx+1,sNx+Olx-1
         dSigmaDx(i,j)=op25*( sigmaX(i+1,j,k-1)+sigmaX(i,j,k-1)
     &                       +sigmaX(i+1,j, k )+sigmaX(i,j, k )
     &                      )*maskC(i,j,k,bi,bj)
         dSigmaDy(i,j)=op25*( sigmaY(i,j+1,k-1)+sigmaY(i,j,k-1)
     &                       +sigmaY(i,j+1, k )+sigmaY(i,j, k )
     &                      )*maskC(i,j,k,bi,bj)
        ENDDO
       ENDDO
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         dSigmaDr(i,j)=sigmaR(i,j,k)
        ENDDO
       ENDDO
CADJ STORE dSigmaDx(:,:)       = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE dSigmaDy(:,:)       = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE dSigmaDr(:,:)       = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE baseSlope(:,:)      = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE hTransLay(:,:)      = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE recipLambda(:,:)    = comlev1_bibj_k, key=kkey, byte=isbyte
       CALL GMREDI_SLOPE_LIMIT(
     O             SlopeX, SlopeY,
     O             SlopeSqr, taperFct,
     U             hTransLay, baseSlope, recipLambda,
     U             dSigmaDr,
     I             dSigmaDx, dSigmaDy,
     I             ldd97_LrhoC, locMixLayer, rF,
     I             kLowC(1-Olx,1-Oly,bi,bj),
     I             k, bi, bj, myTime, myIter, myThid )
       DO j=1-Oly+1,sNy+Oly-1
        DO i=1-Olx+1,sNx+Olx-1
         SlopeX(i,j)=SlopeX(i,j)*maskC(i,j,k,bi,bj)
         SlopeY(i,j)=SlopeY(i,j)*maskC(i,j,k,bi,bj)
         SlopeSqr(i,j)=SlopeSqr(i,j)*maskC(i,j,k,bi,bj)
        ENDDO
       ENDDO
CADJ STORE SlopeX(:,:)       = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE SlopeY(:,:)       = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE SlopeSqr(:,:)     = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE dSigmaDr(:,:)     = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE taperFct(:,:)     = comlev1_bibj_k, key=kkey, byte=isbyte
       DO j=1-Oly+1,sNy+Oly-1
        DO i=1-Olx+1,sNx+Olx-1
          Kwx(i,j,k,bi,bj)= SlopeX(i,j)*taperFct(i,j)
          Kwy(i,j,k,bi,bj)= SlopeY(i,j)*taperFct(i,j)
          Kwz(i,j,k,bi,bj)= SlopeSqr(i,j)*taperFct(i,j)
        ENDDO
       ENDDO
      ENDDO
      DO k=1,Nr
       kkey = (igmkey-1)*Nr + k
CADJ STORE Kwx(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE Kwy(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE Kwz(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
       DO j=1-Oly+1,sNy+Oly-1
        DO i=1-Olx+1,sNx+Olx-1
         Kgm_tmp = GM_isopycK
     &           + GM_skewflx*GM_background_K
         Kwx(i,j,k,bi,bj)= Kgm_tmp*Kwx(i,j,k,bi,bj)
         Kwy(i,j,k,bi,bj)= Kgm_tmp*Kwy(i,j,k,bi,bj)
         Kwz(i,j,k,bi,bj)= ( GM_isopycK
     &                     )*Kwz(i,j,k,bi,bj)
        ENDDO
       ENDDO
      ENDDO
      IF ( .TRUE. ) THEN
       DO j=1-Oly,sNy+Oly
        DO i=2-Olx,sNx+Olx
         locMixLayer(i,j) = ( hMixLayer(i-1,j,bi,bj)
     &                      + hMixLayer( i ,j,bi,bj) )*op5
        ENDDO
       ENDDO
      ENDIF
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
         hTransLay(i,j) =  0.
         baseSlope(i,j) =  0.
         recipLambda(i,j)= 0.
       ENDDO
       DO i=2-Olx,sNx+Olx
         hTransLay(i,j) = MAX( R_low(i-1,j,bi,bj), R_low(i,j,bi,bj) )
       ENDDO
      ENDDO
      DO k=Nr,1,-1
       kp1 = MIN(Nr,k+1)
       maskp1 = 1.d0
       IF (k.GE.Nr) maskp1 = 0.d0
       kkey = (igmkey-1)*Nr + k
       DO j=1-Oly+1,sNy+Oly-1
        DO i=1-Olx+1,sNx+Olx-1
         dSigmaDx(i,j)=sigmaX(i,j,k)
     &                       *maskW(i,j,k,bi,bj)
         dSigmaDy(i,j)=op25*( sigmaY(i-1,j+1,k)+sigmaY(i,j+1,k)
     &                       +sigmaY(i-1, j ,k)+sigmaY(i, j ,k)
     &                      )*maskW(i,j,k,bi,bj)
         dSigmaDr(i,j)=op25*( sigmaR(i-1,j, k )+sigmaR(i,j, k )
     &                      +(sigmaR(i-1,j,kp1)+sigmaR(i,j,kp1))*maskp1
     &                      )*maskW(i,j,k,bi,bj)
        ENDDO
       ENDDO
CADJ STORE SlopeSqr(:,:)       = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE dSigmaDx(:,:)       = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE dSigmaDy(:,:)       = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE dSigmaDr(:,:)       = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE locMixLayer(:,:)    = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE baseSlope(:,:)      = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE hTransLay(:,:)      = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE recipLambda(:,:)    = comlev1_bibj_k, key=kkey, byte=isbyte
       CALL GMREDI_SLOPE_LIMIT(
     O             SlopeX, SlopeY,
     O             SlopeSqr, taperFct,
     U             hTransLay, baseSlope, recipLambda,
     U             dSigmaDr,
     I             dSigmaDx, dSigmaDy,
     I             ldd97_LrhoW, locMixLayer, rC,
     I             kLow_W,
     I             k, bi, bj, myTime, myIter, myThid )
CADJ STORE SlopeSqr(:,:)       = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE taperFct(:,:)       = comlev1_bibj_k, key=kkey, byte=isbyte
        DO j=1-Oly+1,sNy+Oly-1
         DO i=1-Olx+1,sNx+Olx-1
          Kux(i,j,k,bi,bj) =
     &     ( GM_isopycK
     &     )*taperFct(i,j)
         ENDDO
        ENDDO
CADJ STORE Kux(:,:,k,bi,bj)  = comlev1_bibj_k, key=kkey, byte=isbyte
        DO j=1-Oly+1,sNy+Oly-1
         DO i=1-Olx+1,sNx+Olx-1
          Kux(i,j,k,bi,bj) = MAX( Kux(i,j,k,bi,bj), GM_Kmin_horiz )
         ENDDO
        ENDDO
CADJ STORE SlopeX(:,:)       = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE taperFct(:,:)     = comlev1_bibj_k, key=kkey, byte=isbyte
       IF ( GM_ExtraDiag ) THEN
        DO j=1-Oly+1,sNy+Oly-1
         DO i=1-Olx+1,sNx+Olx-1
          Kuz(i,j,k,bi,bj) =
     &     ( GM_isopycK
     &     - GM_skewflx*GM_background_K
     &     )*SlopeX(i,j)*taperFct(i,j)
         ENDDO
        ENDDO
       ENDIF
      ENDDO
      IF ( .TRUE. ) THEN
       DO j=2-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         locMixLayer(i,j) = ( hMixLayer(i,j-1,bi,bj)
     &                      + hMixLayer(i, j ,bi,bj) )*op5
        ENDDO
       ENDDO
      ENDIF
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
         hTransLay(i,j) =  0.
         baseSlope(i,j) =  0.
         recipLambda(i,j)= 0.
       ENDDO
      ENDDO
      DO j=2-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
         hTransLay(i,j) = MAX( R_low(i,j-1,bi,bj), R_low(i,j,bi,bj) )
       ENDDO
      ENDDO
      DO k=Nr,1,-1
       kp1 = MIN(Nr,k+1)
       maskp1 = 1.d0
       IF (k.GE.Nr) maskp1 = 0.d0
       kkey = (igmkey-1)*Nr + k
       DO j=1-Oly+1,sNy+Oly-1
        DO i=1-Olx+1,sNx+Olx-1
         dSigmaDx(i,j)=op25*( sigmaX(i, j ,k) +sigmaX(i+1, j ,k)
     &                       +sigmaX(i,j-1,k) +sigmaX(i+1,j-1,k)
     &                      )*maskS(i,j,k,bi,bj)
         dSigmaDy(i,j)=sigmaY(i,j,k)
     &                       *maskS(i,j,k,bi,bj)
         dSigmaDr(i,j)=op25*( sigmaR(i,j-1, k )+sigmaR(i,j, k )
     &                      +(sigmaR(i,j-1,kp1)+sigmaR(i,j,kp1))*maskp1
     &                      )*maskS(i,j,k,bi,bj)
        ENDDO
       ENDDO
CADJ STORE dSigmaDx(:,:)       = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE dSigmaDy(:,:)       = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE dSigmaDr(:,:)       = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE baseSlope(:,:)      = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE hTransLay(:,:)      = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE recipLambda(:,:)    = comlev1_bibj_k, key=kkey, byte=isbyte
       CALL GMREDI_SLOPE_LIMIT(
     O             SlopeX, SlopeY,
     O             SlopeSqr, taperFct,
     U             hTransLay, baseSlope, recipLambda,
     U             dSigmaDr,
     I             dSigmaDx, dSigmaDy,
     I             ldd97_LrhoS, locMixLayer, rC,
     I             kLow_S,
     I             k, bi, bj, myTime, myIter, myThid )
CADJ STORE taperfct(:,:)       = comlev1_bibj_k, key=kkey, byte=isbyte
        DO j=1-Oly+1,sNy+Oly-1
         DO i=1-Olx+1,sNx+Olx-1
          Kvy(i,j,k,bi,bj) =
     &     ( GM_isopycK
     &     )*taperFct(i,j)
         ENDDO
        ENDDO
CADJ STORE Kvy(:,:,k,bi,bj)  = comlev1_bibj_k, key=kkey, byte=isbyte
        DO j=1-Oly+1,sNy+Oly-1
         DO i=1-Olx+1,sNx+Olx-1
          Kvy(i,j,k,bi,bj) = MAX( Kvy(i,j,k,bi,bj), GM_Kmin_horiz )
         ENDDO
        ENDDO
CADJ STORE SlopeY(:,:)       = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE taperFct(:,:)     = comlev1_bibj_k, key=kkey, byte=isbyte
       IF ( GM_ExtraDiag ) THEN
        DO j=1-Oly+1,sNy+Oly-1
         DO i=1-Olx+1,sNx+Olx-1
          Kvz(i,j,k,bi,bj) =
     &     ( GM_isopycK
     &     - GM_skewflx*GM_background_K
     &     )*SlopeY(i,j)*taperFct(i,j)
         ENDDO
        ENDDO
       ENDIF
      ENDDO
      IF ( taveFreq.GT.0. ) THEN
         CALL TIMEAVE_CUMULATE( GM_Kwx_T, Kwx, Nr,
     &                          deltaTclock, bi, bj, myThid )
         CALL TIMEAVE_CUMULATE( GM_Kwy_T, Kwy, Nr,
     &                          deltaTclock, bi, bj, myThid )
         CALL TIMEAVE_CUMULATE( GM_Kwz_T, Kwz, Nr,
     &                          deltaTclock, bi, bj, myThid )
       GM_timeAve(bi,bj) = GM_timeAve(bi,bj)+deltaTclock
      ENDIF
      RETURN
      END
      SUBROUTINE GMREDI_CALC_TENSOR_DUMMY(
     I             iMin, iMax, jMin, jMax,
     I             sigmaX, sigmaY, sigmaR,
     I             bi, bj, myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      Real*8 op5
      Real*8 op25
      PARAMETER( op5  = 0.5 D 0 )
      PARAMETER( op25 = 0.25 D 0 )
      LOGICAL GM_AdvForm
      LOGICAL GM_AdvSeparate
      LOGICAL GM_ExtraDiag
      LOGICAL GM_InMomAsStress
      LOGICAL GM_MNC
      LOGICAL GM_MDSIO
      COMMON /GM_PARAMS_L/
     &                   GM_AdvForm, GM_AdvSeparate,
     &                   GM_ExtraDiag, GM_MNC, GM_MDSIO,
     &                   GM_InMomAsStress
      CHARACTER*(40) GM_taper_scheme
      COMMON /GM_PARAMS_C/
     &                   GM_taper_scheme
      Real*8 GM_isopycK
      Real*8 GM_background_K
      Real*8 GM_maxSlope
      Real*8 GM_Kmin_horiz
      Real*8 GM_Small_Number
      Real*8 GM_slopeSqCutoff
      Real*8 GM_Visbeck_alpha
      Real*8 GM_Visbeck_length
      Real*8 GM_Visbeck_depth
      Real*8 GM_Visbeck_minDepth
      Real*8 GM_Visbeck_maxSlope
      Real*8 GM_Visbeck_minVal_K
      Real*8 GM_Visbeck_maxVal_K
      Real*8 GM_facTrL2dz
      Real*8 GM_facTrL2ML
      Real*8 GM_maxTransLay
      Real*8 GM_Scrit
      Real*8 GM_Sd
      COMMON /GM_PARAMS_R/
     &                   GM_isopycK, GM_background_K,
     &                   GM_maxSlope,
     &                   GM_Kmin_horiz,
     &                   GM_Small_Number, GM_slopeSqCutoff,
     &                   GM_Visbeck_alpha, GM_Visbeck_length,
     &                   GM_Visbeck_depth,
     &                   GM_Visbeck_minDepth, GM_Visbeck_maxSlope,
     &                   GM_Visbeck_minVal_K, GM_Visbeck_maxVal_K,
     &                   GM_facTrL2dz, GM_facTrL2ML, GM_maxTransLay,
     &                   GM_Scrit, GM_Sd
      Real*8 GM_rMaxSlope
      Real*8 GM_skewflx
      Real*8 GM_advect
      COMMON /GM_DERIVED_PAR/
     &                   GM_rMaxSlope,
     &                   GM_skewflx, GM_advect
      Real*8 Kwx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_Wtensor/ Kwx,Kwy,Kwz
      Real*8 Kux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_HorTensor/ Kux,Kvy
      Real*8 Kuz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_UVtensor/ Kuz,Kvz
C
      Real*8 sigmaX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 sigmaY(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 sigmaR(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      INTEGER iMin,iMax,jMin,jMax
      INTEGER bi, bj
      Real*8     myTime
      INTEGER myIter
      INTEGER myThid
CEndOfInterface
      INTEGER i, j, k
      DO k=1,Nr
       DO j=1-Oly+1,sNy+Oly-1
        DO i=1-Olx+1,sNx+Olx-1
         Kwx(i,j,k,bi,bj) = 0.0
         Kwy(i,j,k,bi,bj) = 0.0
         Kwz(i,j,k,bi,bj) = 0.0
        ENDDO
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
 
      SUBROUTINE GMREDI_CALC_UVFLOW(
     U                       uFld, vFld, uTrans, vTrans,
     I                       k, bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 op5
      Real*8 op25
      PARAMETER( op5  = 0.5 D 0 )
      PARAMETER( op25 = 0.25 D 0 )
      LOGICAL GM_AdvForm
      LOGICAL GM_AdvSeparate
      LOGICAL GM_ExtraDiag
      LOGICAL GM_InMomAsStress
      LOGICAL GM_MNC
      LOGICAL GM_MDSIO
      COMMON /GM_PARAMS_L/
     &                   GM_AdvForm, GM_AdvSeparate,
     &                   GM_ExtraDiag, GM_MNC, GM_MDSIO,
     &                   GM_InMomAsStress
      CHARACTER*(40) GM_taper_scheme
      COMMON /GM_PARAMS_C/
     &                   GM_taper_scheme
      Real*8 GM_isopycK
      Real*8 GM_background_K
      Real*8 GM_maxSlope
      Real*8 GM_Kmin_horiz
      Real*8 GM_Small_Number
      Real*8 GM_slopeSqCutoff
      Real*8 GM_Visbeck_alpha
      Real*8 GM_Visbeck_length
      Real*8 GM_Visbeck_depth
      Real*8 GM_Visbeck_minDepth
      Real*8 GM_Visbeck_maxSlope
      Real*8 GM_Visbeck_minVal_K
      Real*8 GM_Visbeck_maxVal_K
      Real*8 GM_facTrL2dz
      Real*8 GM_facTrL2ML
      Real*8 GM_maxTransLay
      Real*8 GM_Scrit
      Real*8 GM_Sd
      COMMON /GM_PARAMS_R/
     &                   GM_isopycK, GM_background_K,
     &                   GM_maxSlope,
     &                   GM_Kmin_horiz,
     &                   GM_Small_Number, GM_slopeSqCutoff,
     &                   GM_Visbeck_alpha, GM_Visbeck_length,
     &                   GM_Visbeck_depth,
     &                   GM_Visbeck_minDepth, GM_Visbeck_maxSlope,
     &                   GM_Visbeck_minVal_K, GM_Visbeck_maxVal_K,
     &                   GM_facTrL2dz, GM_facTrL2ML, GM_maxTransLay,
     &                   GM_Scrit, GM_Sd
      Real*8 GM_rMaxSlope
      Real*8 GM_skewflx
      Real*8 GM_advect
      COMMON /GM_DERIVED_PAR/
     &                   GM_rMaxSlope,
     &                   GM_skewflx, GM_advect
      Real*8 Kwx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_Wtensor/ Kwx,Kwy,Kwz
      Real*8 Kux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_HorTensor/ Kux,Kvy
      Real*8 Kuz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_UVtensor/ Kuz,Kvz
      INTEGER k, bi, bj, myThid
      Real*8 uFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
 
      SUBROUTINE GMREDI_CALC_WFLOW(
     U                       wFld, rTrans,
     I                       k, bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 op5
      Real*8 op25
      PARAMETER( op5  = 0.5 D 0 )
      PARAMETER( op25 = 0.25 D 0 )
      LOGICAL GM_AdvForm
      LOGICAL GM_AdvSeparate
      LOGICAL GM_ExtraDiag
      LOGICAL GM_InMomAsStress
      LOGICAL GM_MNC
      LOGICAL GM_MDSIO
      COMMON /GM_PARAMS_L/
     &                   GM_AdvForm, GM_AdvSeparate,
     &                   GM_ExtraDiag, GM_MNC, GM_MDSIO,
     &                   GM_InMomAsStress
      CHARACTER*(40) GM_taper_scheme
      COMMON /GM_PARAMS_C/
     &                   GM_taper_scheme
      Real*8 GM_isopycK
      Real*8 GM_background_K
      Real*8 GM_maxSlope
      Real*8 GM_Kmin_horiz
      Real*8 GM_Small_Number
      Real*8 GM_slopeSqCutoff
      Real*8 GM_Visbeck_alpha
      Real*8 GM_Visbeck_length
      Real*8 GM_Visbeck_depth
      Real*8 GM_Visbeck_minDepth
      Real*8 GM_Visbeck_maxSlope
      Real*8 GM_Visbeck_minVal_K
      Real*8 GM_Visbeck_maxVal_K
      Real*8 GM_facTrL2dz
      Real*8 GM_facTrL2ML
      Real*8 GM_maxTransLay
      Real*8 GM_Scrit
      Real*8 GM_Sd
      COMMON /GM_PARAMS_R/
     &                   GM_isopycK, GM_background_K,
     &                   GM_maxSlope,
     &                   GM_Kmin_horiz,
     &                   GM_Small_Number, GM_slopeSqCutoff,
     &                   GM_Visbeck_alpha, GM_Visbeck_length,
     &                   GM_Visbeck_depth,
     &                   GM_Visbeck_minDepth, GM_Visbeck_maxSlope,
     &                   GM_Visbeck_minVal_K, GM_Visbeck_maxVal_K,
     &                   GM_facTrL2dz, GM_facTrL2ML, GM_maxTransLay,
     &                   GM_Scrit, GM_Sd
      Real*8 GM_rMaxSlope
      Real*8 GM_skewflx
      Real*8 GM_advect
      COMMON /GM_DERIVED_PAR/
     &                   GM_rMaxSlope,
     &                   GM_skewflx, GM_advect
      Real*8 Kwx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_Wtensor/ Kwx,Kwy,Kwz
      Real*8 Kux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_HorTensor/ Kux,Kvy
      Real*8 Kuz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_UVtensor/ Kuz,Kvz
      Real*8 wFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER k, bi, bj, myThid
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
 
      SUBROUTINE GMREDI_INIT( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 op5
      Real*8 op25
      PARAMETER( op5  = 0.5 D 0 )
      PARAMETER( op25 = 0.25 D 0 )
      LOGICAL GM_AdvForm
      LOGICAL GM_AdvSeparate
      LOGICAL GM_ExtraDiag
      LOGICAL GM_InMomAsStress
      LOGICAL GM_MNC
      LOGICAL GM_MDSIO
      COMMON /GM_PARAMS_L/
     &                   GM_AdvForm, GM_AdvSeparate,
     &                   GM_ExtraDiag, GM_MNC, GM_MDSIO,
     &                   GM_InMomAsStress
      CHARACTER*(40) GM_taper_scheme
      COMMON /GM_PARAMS_C/
     &                   GM_taper_scheme
      Real*8 GM_isopycK
      Real*8 GM_background_K
      Real*8 GM_maxSlope
      Real*8 GM_Kmin_horiz
      Real*8 GM_Small_Number
      Real*8 GM_slopeSqCutoff
      Real*8 GM_Visbeck_alpha
      Real*8 GM_Visbeck_length
      Real*8 GM_Visbeck_depth
      Real*8 GM_Visbeck_minDepth
      Real*8 GM_Visbeck_maxSlope
      Real*8 GM_Visbeck_minVal_K
      Real*8 GM_Visbeck_maxVal_K
      Real*8 GM_facTrL2dz
      Real*8 GM_facTrL2ML
      Real*8 GM_maxTransLay
      Real*8 GM_Scrit
      Real*8 GM_Sd
      COMMON /GM_PARAMS_R/
     &                   GM_isopycK, GM_background_K,
     &                   GM_maxSlope,
     &                   GM_Kmin_horiz,
     &                   GM_Small_Number, GM_slopeSqCutoff,
     &                   GM_Visbeck_alpha, GM_Visbeck_length,
     &                   GM_Visbeck_depth,
     &                   GM_Visbeck_minDepth, GM_Visbeck_maxSlope,
     &                   GM_Visbeck_minVal_K, GM_Visbeck_maxVal_K,
     &                   GM_facTrL2dz, GM_facTrL2ML, GM_maxTransLay,
     &                   GM_Scrit, GM_Sd
      Real*8 GM_rMaxSlope
      Real*8 GM_skewflx
      Real*8 GM_advect
      COMMON /GM_DERIVED_PAR/
     &                   GM_rMaxSlope,
     &                   GM_skewflx, GM_advect
      Real*8 Kwx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_Wtensor/ Kwx,Kwy,Kwz
      Real*8 Kux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_HorTensor/ Kux,Kvy
      Real*8 Kuz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_UVtensor/ Kuz,Kvz
      Real*8 GM_timeAve  (nSx,nSy)
      Real*8 GM_Kwx_T    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 GM_Kwy_T    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 GM_Kwz_T    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_TAVE_VARS/
     &                       GM_timeAve,
     &                       GM_Kwx_T,
     &                       GM_Kwy_T,
     &                       GM_Kwz_T
      INTEGER myThid
      INTEGER i,j,k,bi,bj
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO k=1,Nr
         DO j=1-Oly,sNy+OLy
          DO i=1-Olx,sNx+Olx
           Kwx(i,j,k,bi,bj) = 0.d0
           Kwy(i,j,k,bi,bj) = 0.d0
           Kwz(i,j,k,bi,bj) = 0.d0
           Kuz(i,j,k,bi,bj) = 0.d0
           Kvz(i,j,k,bi,bj) = 0.d0
           Kux(i,j,k,bi,bj) = 0.d0
           Kvy(i,j,k,bi,bj) = 0.d0
          ENDDO
         ENDDO
        ENDDO
        CALL TIMEAVE_RESET(GM_Kwx_T,Nr, bi,bj,myThid)
        CALL TIMEAVE_RESET(GM_Kwy_T,Nr, bi,bj,myThid)
        CALL TIMEAVE_RESET(GM_Kwz_T,Nr, bi,bj,myThid)
        GM_timeAve(bi,bj) = 0.d0
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
 
      subroutine GMREDI_RTRANSPORT(
     I     iMin,iMax,jMin,jMax,bi,bj,K,
     I     Tracer,tracerIdentity,
     U     df,
     I     myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 op5
      Real*8 op25
      PARAMETER( op5  = 0.5 D 0 )
      PARAMETER( op25 = 0.25 D 0 )
      LOGICAL GM_AdvForm
      LOGICAL GM_AdvSeparate
      LOGICAL GM_ExtraDiag
      LOGICAL GM_InMomAsStress
      LOGICAL GM_MNC
      LOGICAL GM_MDSIO
      COMMON /GM_PARAMS_L/
     &                   GM_AdvForm, GM_AdvSeparate,
     &                   GM_ExtraDiag, GM_MNC, GM_MDSIO,
     &                   GM_InMomAsStress
      CHARACTER*(40) GM_taper_scheme
      COMMON /GM_PARAMS_C/
     &                   GM_taper_scheme
      Real*8 GM_isopycK
      Real*8 GM_background_K
      Real*8 GM_maxSlope
      Real*8 GM_Kmin_horiz
      Real*8 GM_Small_Number
      Real*8 GM_slopeSqCutoff
      Real*8 GM_Visbeck_alpha
      Real*8 GM_Visbeck_length
      Real*8 GM_Visbeck_depth
      Real*8 GM_Visbeck_minDepth
      Real*8 GM_Visbeck_maxSlope
      Real*8 GM_Visbeck_minVal_K
      Real*8 GM_Visbeck_maxVal_K
      Real*8 GM_facTrL2dz
      Real*8 GM_facTrL2ML
      Real*8 GM_maxTransLay
      Real*8 GM_Scrit
      Real*8 GM_Sd
      COMMON /GM_PARAMS_R/
     &                   GM_isopycK, GM_background_K,
     &                   GM_maxSlope,
     &                   GM_Kmin_horiz,
     &                   GM_Small_Number, GM_slopeSqCutoff,
     &                   GM_Visbeck_alpha, GM_Visbeck_length,
     &                   GM_Visbeck_depth,
     &                   GM_Visbeck_minDepth, GM_Visbeck_maxSlope,
     &                   GM_Visbeck_minVal_K, GM_Visbeck_maxVal_K,
     &                   GM_facTrL2dz, GM_facTrL2ML, GM_maxTransLay,
     &                   GM_Scrit, GM_Sd
      Real*8 GM_rMaxSlope
      Real*8 GM_skewflx
      Real*8 GM_advect
      COMMON /GM_DERIVED_PAR/
     &                   GM_rMaxSlope,
     &                   GM_skewflx, GM_advect
      Real*8 Kwx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_Wtensor/ Kwx,Kwy,Kwz
      Real*8 Kux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_HorTensor/ Kux,Kvy
      Real*8 Kuz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_UVtensor/ Kuz,Kvz
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      INTEGER iMin,iMax,jMin,jMax,bi,bj,k
      Real*8 Tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER tracerIdentity
      Real*8 df    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      INTEGER I, J
      Real*8 dTdx  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 dTdy  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
          act0 = tracerIdentity - 1
          max0 = maxpass
          act1 = bi - myBxLo(myThid)
          max1 = myBxHi(myThid) - myBxLo(myThid) + 1
          act2 = bj - myByLo(myThid)
          max2 = myByHi(myThid) - myByLo(myThid) + 1
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = ikey_dynamics - 1
          igadkey = (act0 + 1) 
     &                      + act1*max0
     &                      + act2*max0*max1
     &                      + act3*max0*max1*max2
     &                      + act4*max0*max1*max2*max3
          kkey = (igadkey-1)*Nr + k
          if (tracerIdentity.GT.maxpass) then
             print *, 'ph-pass gmredi_rtrans ', maxpass, tracerIdentity
             STOP 'maxpass seems smaller than tracerIdentity'
          endif
      IF (useGMRedi .AND. K.GT.1) THEN
      DO j=jMin,jMax
       DO i=iMin,iMax
        dTdx(i,j) = op5*(
     &   +op5*(maskW(i+1,j,k,bi,bj)
     &         *recip_dxC(i+1,j,bi,bj)*
     &           (Tracer(i+1,j,k,bi,bj)-Tracer(i,j,k,bi,bj))
     &        +maskW(i,j,k,bi,bj)
     &         *recip_dxC(i,j,bi,bj)*
     &           (Tracer(i,j,k,bi,bj)-Tracer(i-1,j,k,bi,bj)))
     &   +op5*(maskW(i+1,j,k-1,bi,bj)
     &         *recip_dxC(i+1,j,bi,bj)*
     &           (Tracer(i+1,j,k-1,bi,bj)-Tracer(i,j,k-1,bi,bj))
     &        +maskW(i,j,k-1,bi,bj)
     &         *recip_dxC(i,j,bi,bj)*
     &           (Tracer(i,j,k-1,bi,bj)-Tracer(i-1,j,k-1,bi,bj)))
     &       )
        dTdy(i,j) = op5*(
     &   +op5*(maskS(i,j,k,bi,bj)
     &         *recip_dyC(i,j,bi,bj)*
     &           (Tracer(i,j,k,bi,bj)-Tracer(i,j-1,k,bi,bj))
     &        +maskS(i,j+1,k,bi,bj)
     &         *recip_dyC(i,j+1,bi,bj)*
     &           (Tracer(i,j+1,k,bi,bj)-Tracer(i,j,k,bi,bj)))
     &   +op5*(maskS(i,j,k-1,bi,bj)
     &         *recip_dyC(i,j,bi,bj)*
     &           (Tracer(i,j,k-1,bi,bj)-Tracer(i,j-1,k-1,bi,bj))
     &        +maskS(i,j+1,k-1,bi,bj)
     &         *recip_dyC(i,j+1,bi,bj)*
     &           (Tracer(i,j+1,k-1,bi,bj)-Tracer(i,j,k-1,bi,bj)))
     &       )
       ENDDO
      ENDDO
 
      DO j=jMin,jMax
       DO i=iMin,iMax
        IF ( tracerIdentity .LT. GAD_TR1 ) THEN
         df(i,j) = df(i,j)
     &      - rA(i,j,bi,bj)
     &        *( Kwx(i,j,k,bi,bj)*dTdx(i,j)+Kwy(i,j,k,bi,bj)*dTdy(i,j) )
        ELSE
         df(i,j) = df(i,j)
     &      - rA(i,j,bi,bj)
     &        *( Kwx(i,j,k,bi,bj)*dTdx(i,j)+Kwy(i,j,k,bi,bj)*dTdy(i,j) )
        ENDIF
       ENDDO
      ENDDO
c
c
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
 
      SUBROUTINE GMREDI_SLOPE_LIMIT(
     O             SlopeX, SlopeY,
     O             SlopeSqr, taperFct,
     U             hTransLay, baseSlope, recipLambda,
     U             dSigmaDr,
     I             dSigmaDx, dSigmaDy,
     I             Lrho, hMixLay, depthZ, kLow,
     I             k, bi, bj, myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      Real*8 op5
      Real*8 op25
      PARAMETER( op5  = 0.5 D 0 )
      PARAMETER( op25 = 0.25 D 0 )
      LOGICAL GM_AdvForm
      LOGICAL GM_AdvSeparate
      LOGICAL GM_ExtraDiag
      LOGICAL GM_InMomAsStress
      LOGICAL GM_MNC
      LOGICAL GM_MDSIO
      COMMON /GM_PARAMS_L/
     &                   GM_AdvForm, GM_AdvSeparate,
     &                   GM_ExtraDiag, GM_MNC, GM_MDSIO,
     &                   GM_InMomAsStress
      CHARACTER*(40) GM_taper_scheme
      COMMON /GM_PARAMS_C/
     &                   GM_taper_scheme
      Real*8 GM_isopycK
      Real*8 GM_background_K
      Real*8 GM_maxSlope
      Real*8 GM_Kmin_horiz
      Real*8 GM_Small_Number
      Real*8 GM_slopeSqCutoff
      Real*8 GM_Visbeck_alpha
      Real*8 GM_Visbeck_length
      Real*8 GM_Visbeck_depth
      Real*8 GM_Visbeck_minDepth
      Real*8 GM_Visbeck_maxSlope
      Real*8 GM_Visbeck_minVal_K
      Real*8 GM_Visbeck_maxVal_K
      Real*8 GM_facTrL2dz
      Real*8 GM_facTrL2ML
      Real*8 GM_maxTransLay
      Real*8 GM_Scrit
      Real*8 GM_Sd
      COMMON /GM_PARAMS_R/
     &                   GM_isopycK, GM_background_K,
     &                   GM_maxSlope,
     &                   GM_Kmin_horiz,
     &                   GM_Small_Number, GM_slopeSqCutoff,
     &                   GM_Visbeck_alpha, GM_Visbeck_length,
     &                   GM_Visbeck_depth,
     &                   GM_Visbeck_minDepth, GM_Visbeck_maxSlope,
     &                   GM_Visbeck_minVal_K, GM_Visbeck_maxVal_K,
     &                   GM_facTrL2dz, GM_facTrL2ML, GM_maxTransLay,
     &                   GM_Scrit, GM_Sd
      Real*8 GM_rMaxSlope
      Real*8 GM_skewflx
      Real*8 GM_advect
      COMMON /GM_DERIVED_PAR/
     &                   GM_rMaxSlope,
     &                   GM_skewflx, GM_advect
      Real*8 Kwx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_Wtensor/ Kwx,Kwy,Kwz
      Real*8 Kux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_HorTensor/ Kux,Kvy
      Real*8 Kuz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_UVtensor/ Kuz,Kvz
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      Real*8 SlopeX     (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 SlopeY     (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 SlopeSqr   (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 taperFct   (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 hTransLay  (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 baseSlope  (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 recipLambda(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 dSigmaDr   (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 dSigmaDx   (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 dSigmaDy   (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 Lrho       (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 hMixLay    (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 depthZ(*)
      INTEGER kLow   (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      INTEGER k, bi,bj
      Real*8     myTime
      INTEGER myIter
      INTEGER myThid
      Real*8 dSigmMod(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 SlopeMod(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 dRdSigmaLtd(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 tmpFld(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 locVar(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 f1,Smod,f2,Rnondim
      Real*8 maxSlopeSqr
      Real*8 fpi
      PARAMETER( fpi = PI )
      INTEGER i,j
      Real*8 dTransLay, rLambMin, DoverLamb
      Real*8 taperFctLoc, taperFctHat
      Real*8 minTransLay
      Real*8 GM_bigSlope
      GM_bigSlope = 1.D+02
CADJ PASSIVE depthz
      act1 = bi - myBxLo(myThid)
      max1 = myBxHi(myThid) - myBxLo(myThid) + 1
      act2 = bj - myByLo(myThid)
      max2 = myByHi(myThid) - myByLo(myThid) + 1
      act3 = myThid - 1
      max3 = nTx*nTy
      act4 = ikey_dynamics - 1
      ikey = (act1 + 1) + act2*max1
     &                  + act3*max1*max2
     &                  + act4*max1*max2*max3
      DO j=1-Oly+1,sNy+Oly-1
       DO i=1-Olx+1,sNx+Olx-1
        dSigmMod(i,j)    = 0.d0
        tmpFld(i,j)      = 0.d0
       ENDDO
      ENDDO
      IF (GM_taper_scheme.EQ.'orig' .OR.
     &    GM_taper_scheme.EQ.'clipping') THEN
        STOP 'Need to compile without "#define GM_EXCLUDE_CLIPPING"'
      ELSEIF (GM_taper_scheme.EQ.'fm07' ) THEN
        STOP 'Need to compile without "#define GM_EXCLUDE_FM07_TAP"'
      ELSE IF (GM_taper_scheme.EQ.'ac02') THEN
        STOP 'Need to compile without "#define GM_EXCLUDE_AC02_TAP"'
      ELSE
cnostore CADJ STORE dSigmaDr(:,:)     = comlev1_bibj, key=ikey, byte=isbyte
        DO j=1-Oly+1,sNy+Oly-1
         DO i=1-Olx+1,sNx+Olx-1
          IF ( dSigmaDr(i,j) .NE. 0. ) THEN
           IF (dSigmaDr(i,j).GE.(-GM_Small_Number))
     &         dSigmaDr(i,j) = -GM_Small_Number
          ENDIF
         ENDDO
        ENDDO
cnostore CADJ STORE dSigmaDx(:,:)     = comlev1_bibj, key=ikey, byte=isbyte
cnostore CADJ STORE dSigmaDy(:,:)     = comlev1_bibj, key=ikey, byte=isbyte
cnostore CADJ STORE dSigmaDr(:,:)     = comlev1_bibj, key=ikey, byte=isbyte
        DO j=1-Oly+1,sNy+Oly-1
         DO i=1-Olx+1,sNx+Olx-1
          IF ( dSigmaDr(i,j) .EQ. 0. ) THEN
           IF ( dSigmaDx(i,j) .NE. 0. ) THEN
            SlopeX(i,j) = SIGN( GM_bigSlope, dSigmaDx(i,j) )
           ELSE
            SlopeX(i,j) = 0.d0
           ENDIF
           IF ( dSigmaDy(i,j) .NE. 0. ) THEN
            SlopeY(i,j) = SIGN( GM_bigSlope, dSigmaDy(i,j) )
           ELSE
            SlopeY(i,j) = 0.d0
           ENDIF
          ELSE
           dRdSigmaLtd(i,j) = 1.d0 / dSigmaDr(i,j)
           SlopeX(i,j)=-dSigmaDx(i,j)*dRdSigmaLtd(i,j)
           SlopeY(i,j)=-dSigmaDy(i,j)*dRdSigmaLtd(i,j)
          ENDIF
         ENDDO
        ENDDO
cnostore CADJ STORE slopeX(:,:)       = comlev1_bibj, key=ikey, byte=isbyte
cnostore CADJ STORE slopeY(:,:)       = comlev1_bibj, key=ikey, byte=isbyte
        DO j=1-Oly+1,sNy+Oly-1
         DO i=1-Olx+1,sNx+Olx-1
          SlopeSqr(i,j) = SlopeX(i,j)*SlopeX(i,j)
     &                   +SlopeY(i,j)*SlopeY(i,j)
          taperFct(i,j) = 1.d0
          IF ( SlopeSqr(i,j) .GT. GM_slopeSqCutoff ) THEN
             slopeSqr(i,j) = GM_slopeSqCutoff
             taperFct(i,j) = 0.d0
          ENDIF
         ENDDO
        ENDDO
       IF (GM_taper_scheme.EQ.'linear') THEN
        maxSlopeSqr = GM_maxSlope*GM_maxSlope
        DO j=1-Oly+1,sNy+Oly-1
         DO i=1-Olx+1,sNx+Olx-1
          IF ( SlopeSqr(i,j) .EQ. 0. ) THEN
           taperFct(i,j) = 1.d0
          ELSE IF ( SlopeSqr(i,j) .GT. maxSlopeSqr .AND.
     &             SlopeSqr(i,j) .LT. GM_slopeSqCutoff )  THEN
           taperFct(i,j) = SQRT(maxSlopeSqr / SlopeSqr(i,j))
           slopeSqr(i,j) = MIN( slopeSqr(i,j),GM_bigSlope*GM_bigSlope )
          ENDIF
         ENDDO
        ENDDO
       ELSEIF (GM_taper_scheme.EQ.'gkw91') THEN
        maxSlopeSqr = GM_maxSlope*GM_maxSlope
        DO j=1-Oly+1,sNy+Oly-1
         DO i=1-Olx+1,sNx+Olx-1
          IF ( SlopeSqr(i,j) .EQ. 0. ) THEN
           taperFct(i,j) = 1.d0
          ELSE IF ( SlopeSqr(i,j) .GT. maxSlopeSqr .AND.
     &             SlopeSqr(i,j) .LT. GM_slopeSqCutoff ) THEN
           taperFct(i,j) = maxSlopeSqr/SlopeSqr(i,j)
          ENDIF
         ENDDO
        ENDDO
       ELSEIF (GM_taper_scheme.EQ.'dm95') THEN
        DO j=1-Oly+1,sNy+Oly-1
         DO i=1-Olx+1,sNx+Olx-1
          IF ( SlopeSqr(i,j) .EQ. 0. ) THEN
           taperFct(i,j) = 1.d0
          ELSE IF ( SlopeSqr(i,j) .LT. GM_slopeSqCutoff ) THEN
           Smod=SQRT(SlopeSqr(i,j))
           taperFct(i,j)=op5*( 1.d0 + tanh( (GM_Scrit-Smod)/GM_Sd ))
          ENDIF
         ENDDO
        ENDDO
       ELSEIF (GM_taper_scheme.EQ.'ldd97') THEN
        DO j=1-Oly+1,sNy+Oly-1
         DO i=1-Olx+1,sNx+Olx-1
          IF (SlopeSqr(i,j) .EQ. 0.) THEN
           taperFct(i,j) = 1.d0
          ELSEIF ( SlopeSqr(i,j) .LT. GM_slopeSqCutoff ) THEN
           Smod=SQRT(SlopeSqr(i,j))
           f1=op5*( 1.d0 + tanh( (GM_Scrit-Smod)/GM_Sd ))
           Rnondim= -depthZ(k)/(Lrho(i,j)*Smod)
           IF ( Rnondim.GE.1.d0 ) THEN
             f2 = 1.d0
           ELSE
             f2 = op5*( 1.d0 + SIN( fpi*(Rnondim-op5) ))
           ENDIF
           taperFct(i,j)=f1*f2
          ENDIF
         ENDDO
        ENDDO
       ELSEIF (GM_taper_scheme.NE.' ') THEN
        STOP 'GMREDI_SLOPE_LIMIT: Bad GM_taper_scheme'
       ENDIF
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
 
CStartOfInterface
      SUBROUTINE GMREDI_SLOPE_PSI(
     O             taperX, taperY,
     U             SlopeX, SlopeY,
     U             dSigmaDrW,dSigmaDrS,
     I             LrhoW, LrhoS, depthZ, K,
     I             bi,bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      Real*8 op5
      Real*8 op25
      PARAMETER( op5  = 0.5 D 0 )
      PARAMETER( op25 = 0.25 D 0 )
      LOGICAL GM_AdvForm
      LOGICAL GM_AdvSeparate
      LOGICAL GM_ExtraDiag
      LOGICAL GM_InMomAsStress
      LOGICAL GM_MNC
      LOGICAL GM_MDSIO
      COMMON /GM_PARAMS_L/
     &                   GM_AdvForm, GM_AdvSeparate,
     &                   GM_ExtraDiag, GM_MNC, GM_MDSIO,
     &                   GM_InMomAsStress
      CHARACTER*(40) GM_taper_scheme
      COMMON /GM_PARAMS_C/
     &                   GM_taper_scheme
      Real*8 GM_isopycK
      Real*8 GM_background_K
      Real*8 GM_maxSlope
      Real*8 GM_Kmin_horiz
      Real*8 GM_Small_Number
      Real*8 GM_slopeSqCutoff
      Real*8 GM_Visbeck_alpha
      Real*8 GM_Visbeck_length
      Real*8 GM_Visbeck_depth
      Real*8 GM_Visbeck_minDepth
      Real*8 GM_Visbeck_maxSlope
      Real*8 GM_Visbeck_minVal_K
      Real*8 GM_Visbeck_maxVal_K
      Real*8 GM_facTrL2dz
      Real*8 GM_facTrL2ML
      Real*8 GM_maxTransLay
      Real*8 GM_Scrit
      Real*8 GM_Sd
      COMMON /GM_PARAMS_R/
     &                   GM_isopycK, GM_background_K,
     &                   GM_maxSlope,
     &                   GM_Kmin_horiz,
     &                   GM_Small_Number, GM_slopeSqCutoff,
     &                   GM_Visbeck_alpha, GM_Visbeck_length,
     &                   GM_Visbeck_depth,
     &                   GM_Visbeck_minDepth, GM_Visbeck_maxSlope,
     &                   GM_Visbeck_minVal_K, GM_Visbeck_maxVal_K,
     &                   GM_facTrL2dz, GM_facTrL2ML, GM_maxTransLay,
     &                   GM_Scrit, GM_Sd
      Real*8 GM_rMaxSlope
      Real*8 GM_skewflx
      Real*8 GM_advect
      COMMON /GM_DERIVED_PAR/
     &                   GM_rMaxSlope,
     &                   GM_skewflx, GM_advect
      Real*8 Kwx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_Wtensor/ Kwx,Kwy,Kwz
      Real*8 Kux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_HorTensor/ Kux,Kvy
      Real*8 Kuz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_UVtensor/ Kuz,Kvz
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
C
      Real*8 taperX(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 taperY(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 SlopeX(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 SlopeY(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 dSigmaDrW(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 dSigmaDrS(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 LrhoW(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 LrhoS(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 depthZ
      INTEGER K,bi,bj,myThid
CEndOfInterface
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
 
      SUBROUTINE GMREDI_XTRANSPORT(
     I     iMin,iMax,jMin,jMax,bi,bj,K,
     I     xA,Tracer,tracerIdentity,
     U     df,
     I     myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 op5
      Real*8 op25
      PARAMETER( op5  = 0.5 D 0 )
      PARAMETER( op25 = 0.25 D 0 )
      LOGICAL GM_AdvForm
      LOGICAL GM_AdvSeparate
      LOGICAL GM_ExtraDiag
      LOGICAL GM_InMomAsStress
      LOGICAL GM_MNC
      LOGICAL GM_MDSIO
      COMMON /GM_PARAMS_L/
     &                   GM_AdvForm, GM_AdvSeparate,
     &                   GM_ExtraDiag, GM_MNC, GM_MDSIO,
     &                   GM_InMomAsStress
      CHARACTER*(40) GM_taper_scheme
      COMMON /GM_PARAMS_C/
     &                   GM_taper_scheme
      Real*8 GM_isopycK
      Real*8 GM_background_K
      Real*8 GM_maxSlope
      Real*8 GM_Kmin_horiz
      Real*8 GM_Small_Number
      Real*8 GM_slopeSqCutoff
      Real*8 GM_Visbeck_alpha
      Real*8 GM_Visbeck_length
      Real*8 GM_Visbeck_depth
      Real*8 GM_Visbeck_minDepth
      Real*8 GM_Visbeck_maxSlope
      Real*8 GM_Visbeck_minVal_K
      Real*8 GM_Visbeck_maxVal_K
      Real*8 GM_facTrL2dz
      Real*8 GM_facTrL2ML
      Real*8 GM_maxTransLay
      Real*8 GM_Scrit
      Real*8 GM_Sd
      COMMON /GM_PARAMS_R/
     &                   GM_isopycK, GM_background_K,
     &                   GM_maxSlope,
     &                   GM_Kmin_horiz,
     &                   GM_Small_Number, GM_slopeSqCutoff,
     &                   GM_Visbeck_alpha, GM_Visbeck_length,
     &                   GM_Visbeck_depth,
     &                   GM_Visbeck_minDepth, GM_Visbeck_maxSlope,
     &                   GM_Visbeck_minVal_K, GM_Visbeck_maxVal_K,
     &                   GM_facTrL2dz, GM_facTrL2ML, GM_maxTransLay,
     &                   GM_Scrit, GM_Sd
      Real*8 GM_rMaxSlope
      Real*8 GM_skewflx
      Real*8 GM_advect
      COMMON /GM_DERIVED_PAR/
     &                   GM_rMaxSlope,
     &                   GM_skewflx, GM_advect
      Real*8 Kwx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_Wtensor/ Kwx,Kwy,Kwz
      Real*8 Kux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_HorTensor/ Kux,Kvy
      Real*8 Kuz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_UVtensor/ Kuz,Kvz
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      INTEGER iMin,iMax,jMin,jMax,bi,bj,k
      Real*8 xA(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 Tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      integer tracerIdentity
      Real*8 df    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      INTEGER I, J
      INTEGER kp1
      INTEGER km1
      Real*8 dTdz  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
          act0 = tracerIdentity - 1
          max0 = maxpass
          act1 = bi - myBxLo(myThid)
          max1 = myBxHi(myThid) - myBxLo(myThid) + 1
          act2 = bj - myByLo(myThid)
          max2 = myByHi(myThid) - myByLo(myThid) + 1
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = ikey_dynamics - 1
          igadkey = (act0 + 1)
     &                      + act1*max0
     &                      + act2*max0*max1
     &                      + act3*max0*max1*max2
     &                      + act4*max0*max1*max2*max3
          kkey = (igadkey-1)*Nr + k
          if (tracerIdentity.GT.maxpass) then
             print *, 'ph-pass gmredi_xtrans ', maxpass, tracerIdentity
             STOP 'maxpass seems smaller than tracerIdentity'
          endif
      IF (useGMRedi) THEN
CADJ STORE Kux(:,:,k,bi,bj) =
CADJ &     comlev1_gmredi_k_gad, key=kkey, byte=isbyte
CADJ STORE Kuz(:,:,k,bi,bj) =
CADJ &     comlev1_gmredi_k_gad, key=kkey, byte=isbyte
      DO j=jMin,jMax
       DO i=iMin,iMax
        df(i,j) = df(i,j)
     &   -xA(i,j)
     &    *Kux(i,j,k,bi,bj)
     &    *recip_dxC(i,j,bi,bj)
     &    *(Tracer(i,j,k,bi,bj)-Tracer(i-1,j,k,bi,bj))
       ENDDO
      ENDDO
      IF (GM_ExtraDiag) THEN
       km1 = MAX(k-1,1)
       kp1 = MIN(k+1,Nr)
       DO j=jMin,jMax
        DO i=iMin,iMax
        dTdz(i,j) =  op5*(
     &   +op5*recip_drC(k)*
     &       ( maskC(i-1,j,k,bi,bj)*
     &           (Tracer(i-1,j,km1,bi,bj)-Tracer(i-1,j,k,bi,bj))
     &        +maskC( i ,j,k,bi,bj)*
     &           (Tracer( i ,j,km1,bi,bj)-Tracer( i ,j,k,bi,bj))
     &       )
     &   +op5*recip_drC(kp1)*
     &       ( maskC(i-1,j,kp1,bi,bj)*
     &           (Tracer(i-1,j,k,bi,bj)-Tracer(i-1,j,kp1,bi,bj))
     &        +maskC( i ,j,kp1,bi,bj)*
     &           (Tracer( i ,j,k,bi,bj)-Tracer( i ,j,kp1,bi,bj))
     &       )      )
        ENDDO
       ENDDO
       DO j=jMin,jMax
        DO i=iMin,iMax
        df(i,j) = df(i,j) - xA(i,j)*Kuz(i,j,k,bi,bj)*dTdz(i,j)
        ENDDO
       ENDDO
      ENDIF
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
 
      SUBROUTINE GMREDI_YTRANSPORT(
     I     iMin,iMax,jMin,jMax,bi,bj,K,
     I     yA,Tracer,tracerIdentity,
     U     df,
     I     myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 op5
      Real*8 op25
      PARAMETER( op5  = 0.5 D 0 )
      PARAMETER( op25 = 0.25 D 0 )
      LOGICAL GM_AdvForm
      LOGICAL GM_AdvSeparate
      LOGICAL GM_ExtraDiag
      LOGICAL GM_InMomAsStress
      LOGICAL GM_MNC
      LOGICAL GM_MDSIO
      COMMON /GM_PARAMS_L/
     &                   GM_AdvForm, GM_AdvSeparate,
     &                   GM_ExtraDiag, GM_MNC, GM_MDSIO,
     &                   GM_InMomAsStress
      CHARACTER*(40) GM_taper_scheme
      COMMON /GM_PARAMS_C/
     &                   GM_taper_scheme
      Real*8 GM_isopycK
      Real*8 GM_background_K
      Real*8 GM_maxSlope
      Real*8 GM_Kmin_horiz
      Real*8 GM_Small_Number
      Real*8 GM_slopeSqCutoff
      Real*8 GM_Visbeck_alpha
      Real*8 GM_Visbeck_length
      Real*8 GM_Visbeck_depth
      Real*8 GM_Visbeck_minDepth
      Real*8 GM_Visbeck_maxSlope
      Real*8 GM_Visbeck_minVal_K
      Real*8 GM_Visbeck_maxVal_K
      Real*8 GM_facTrL2dz
      Real*8 GM_facTrL2ML
      Real*8 GM_maxTransLay
      Real*8 GM_Scrit
      Real*8 GM_Sd
      COMMON /GM_PARAMS_R/
     &                   GM_isopycK, GM_background_K,
     &                   GM_maxSlope,
     &                   GM_Kmin_horiz,
     &                   GM_Small_Number, GM_slopeSqCutoff,
     &                   GM_Visbeck_alpha, GM_Visbeck_length,
     &                   GM_Visbeck_depth,
     &                   GM_Visbeck_minDepth, GM_Visbeck_maxSlope,
     &                   GM_Visbeck_minVal_K, GM_Visbeck_maxVal_K,
     &                   GM_facTrL2dz, GM_facTrL2ML, GM_maxTransLay,
     &                   GM_Scrit, GM_Sd
      Real*8 GM_rMaxSlope
      Real*8 GM_skewflx
      Real*8 GM_advect
      COMMON /GM_DERIVED_PAR/
     &                   GM_rMaxSlope,
     &                   GM_skewflx, GM_advect
      Real*8 Kwx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_Wtensor/ Kwx,Kwy,Kwz
      Real*8 Kux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_HorTensor/ Kux,Kvy
      Real*8 Kuz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_UVtensor/ Kuz,Kvz
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      INTEGER iMin,iMax,jMin,jMax,bi,bj,k
      Real*8 yA(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 Tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      integer tracerIdentity
      Real*8 df    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      INTEGER I, J
      INTEGER kp1
      INTEGER km1
      Real*8 dTdz(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
          act0 = tracerIdentity - 1
          max0 = maxpass
          act1 = bi - myBxLo(myThid)
          max1 = myBxHi(myThid) - myBxLo(myThid) + 1
          act2 = bj - myByLo(myThid)
          max2 = myByHi(myThid) - myByLo(myThid) + 1
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = ikey_dynamics - 1
          igadkey = (act0 + 1)
     &                      + act1*max0
     &                      + act2*max0*max1
     &                      + act3*max0*max1*max2
     &                      + act4*max0*max1*max2*max3
          kkey = (igadkey-1)*Nr + k
          if (tracerIdentity.GT.maxpass) then
             print *, 'ph-pass gmredi_ytrans ', maxpass, tracerIdentity
             STOP 'maxpass seems smaller than tracerIdentity'
          endif
      IF (useGMRedi) THEN
CADJ STORE Kvy(:,:,k,bi,bj) =
CADJ &     comlev1_gmredi_k_gad, key=kkey, byte=isbyte
CADJ STORE Kvz(:,:,k,bi,bj) =
CADJ &     comlev1_gmredi_k_gad, key=kkey, byte=isbyte
      DO j=jMin,jMax
       DO i=iMin,iMax
        df(i,j) = df(i,j)
     &   -yA(i,j)
     &    *Kvy(i,j,k,bi,bj)
     &    *recip_dyC(i,j,bi,bj)
     &    *(Tracer(i,j,k,bi,bj)-Tracer(i,j-1,k,bi,bj))
       ENDDO
      ENDDO
      IF (GM_ExtraDiag) THEN
       km1 = MAX(k-1,1)
       kp1 = MIN(k+1,Nr)
       DO j=jMin,jMax
        DO i=iMin,iMax
        dTdz(i,j) =  op5*(
     &   +op5*recip_drC(k)*
     &       ( maskC(i,j-1,k,bi,bj)*
     &           (Tracer(i,j-1,km1,bi,bj)-Tracer(i,j-1,k,bi,bj))
     &        +maskC(i, j ,k,bi,bj)*
     &           (Tracer(i, j ,km1,bi,bj)-Tracer(i, j ,k,bi,bj))
     &       )
     &   +op5*recip_drC(kp1)*
     &       ( maskC(i,j-1,kp1,bi,bj)*
     &           (Tracer(i,j-1,k,bi,bj)-Tracer(i,j-1,kp1,bi,bj))
     &        +maskC(i, j ,kp1,bi,bj)*
     &           (Tracer(i, j ,k,bi,bj)-Tracer(i, j ,kp1,bi,bj))
     &       )      )
        ENDDO
       ENDDO
       DO j=jMin,jMax
        DO i=iMin,iMax
          df(i,j) = df(i,j) - yA(i,j)*Kvz(i,j,k,bi,bj)*dTdz(i,j)
        ENDDO
       ENDDO
      ENDIF
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_CALC_ABSVORT3( 
     I        bi,bj,k,
     I        vort3,
     O        omega3,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 vort3(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 omega3(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      INTEGER i,j
      Real*8 nonLinFac,useCoriolisFac
      IF (momAdvection) THEN
        nonLinFac=1.
      ELSE
        nonLinFac=0.
      ENDIF
      IF (useCoriolis) THEN
        useCoriolisFac=1.
      ELSE
        useCoriolisFac=0.
      ENDIF
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
        omega3(I,J)=
     &      fCoriG(i,j,bi,bj)*useCoriolisFac
     &     +vort3(i,j)*nonLinFac
       ENDDO
      ENDDO
        
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_CALC_HDIV( 
     I        bi,bj,k, hDivScheme,
     I        uFld, vFld,
     O        hDiv,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k,hDivScheme
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hDiv(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      INTEGER i,j
      IF (hDivScheme.EQ.1) THEN
       DO J=1-Oly,sNy+Oly-1
        DO I=1-Olx,sNx+Olx-1
         hDiv(I,J)=(
     &       uFld(i+1, j )*dyg(i+1, j ,bi,bj)
     &      -uFld( i , j )*dyg( i , j ,bi,bj)
     &      +vFld( i ,j+1)*dxg( i ,j+1,bi,bj)
     &      -vFld( i , j )*dxg( i , j ,bi,bj)
     &             )*recip_rA(I,J,bi,bj)
        ENDDO
       ENDDO
      ELSEIF (hDivScheme.EQ.2) THEN
       DO J=1-Oly,sNy+Oly-1
        DO I=1-Olx,sNx+Olx-1
         hDiv(I,J)= 
     &    ( ( uFld(i+1, j )*dyg(i+1, j ,bi,bj)*hFacW(i+1, j ,K,bi,bj)
     &       -uFld( i , j )*dyg( i , j ,bi,bj)*hFacW( i , j ,K,bi,bj) )
     &     +( vFld( i ,j+1)*dxg( i ,j+1,bi,bj)*hFacS( i ,j+1,K,bi,bj)
     &       -vFld( i , j )*dxg( i , j ,bi,bj)*hFacS( i , j ,K,bi,bj) )
     &    )*recip_rA(I,J,bi,bj)
     &     *recip_hFacC(i,j,k,bi,bj)
        ENDDO
       ENDDO
      ELSE
       STOP 'S/R MOM_CALC_HDIV: We should never reach this point!'
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_CALC_HFACZ(
     I        bi,bj,k,
     O        hFacZ,r_hFacZ,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      INTEGER bi,bj,k
      INTEGER myThid
      Real*8 hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 r_hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER I,J
      Real*8     hFacZOpen
      INTEGER hZoption
      LOGICAL northWestCorner, northEastCorner,
     &        southWestCorner, southEastCorner
      INTEGER myFace
      PARAMETER ( hZoption = 0 )
      DO i=1-Olx,sNx+Olx
        hFacZ(i,1-Oly)=0.
      ENDDO
      DO j=2-Oly,sNy+Oly
        hFacZ(1-Olx,j)=0.
      ENDDO
      IF ( hZoption.EQ.2 ) THEN
        DO j=2-Oly,sNy+Oly
         DO i=2-Olx,sNx+Olx
          hFacZOpen=
     &               ( hFacW(i, j ,k,bi,bj)
     &                +hFacW(i,j-1,k,bi,bj) )
     &             + ( hFacS( i ,j,k,bi,bj)
     &                +hFacS(i-1,j,k,bi,bj) )
          hFacZ(i,j) = 0.25d0 * hFacZOpen
         ENDDO
        ENDDO
      ELSEIF ( hZoption.EQ.1 ) THEN
        DO j=2-Oly,sNy+Oly
         DO i=2-Olx,sNx+Olx
          hFacZOpen=MIN(
     &                  hFacW(i, j ,k,bi,bj)
     &                + hFacW(i,j-1,k,bi,bj)
     &                , hFacS( i ,j,k,bi,bj)
     &                + hFacS(i-1,j,k,bi,bj)
     &                 )
          hFacZ(i,j) = 0.5d0 * hFacZOpen
         ENDDO
        ENDDO
      ELSE
        DO j=2-Oly,sNy+Oly
         DO i=2-Olx,sNx+Olx
          hFacZOpen=MIN(hFacW(i,j,k,bi,bj),
     &                  hFacW(i,j-1,k,bi,bj))
          hFacZOpen=MIN(hFacS(i,j,k,bi,bj),hFacZOpen)
          hFacZOpen=MIN(hFacS(i-1,j,k,bi,bj),hFacZOpen)
          hFacZ(i,j)=hFacZOpen
         ENDDO
        ENDDO
      ENDIF
      IF ( useCubedSphereExchange .AND. hZoption.GE.1 ) THEN
        myFace = bi
        southWestCorner = .TRUE.
        southEastCorner = .TRUE.
        northWestCorner = .TRUE.
        northEastCorner = .TRUE.
        IF ( southWestCorner ) THEN
         i=1
         j=1
         IF ( hZoption.EQ.1 ) THEN
          hFacZOpen=MIN(hFacW(i,j,k,bi,bj),
     &                  hFacW(i,j-1,k,bi,bj))
          hFacZOpen=MIN(hFacS(i,j,k,bi,bj),hFacZOpen)
          hFacZ(i,j)=hFacZOpen
         ELSE
          IF ( MOD(myFace,2).EQ.1 ) THEN
            hFacZOpen=
     &               ( hFacW(i,j-1,k,bi,bj)
     &                +hFacS( i ,j,k,bi,bj) )
     &               + hFacW(i, j ,k,bi,bj)
          ELSE
            hFacZOpen=
     &               ( hFacW(i, j ,k,bi,bj)
     &                +hFacW(i,j-1,k,bi,bj) )
     &               + hFacS( i ,j,k,bi,bj)
          ENDIF
          hFacZ(i,j) = hFacZOpen / 3.d0
         ENDIF
        ENDIF
        IF ( southEastCorner ) THEN
         I=sNx+1
         J=1
         IF ( hZoption.EQ.1 ) THEN
          hFacZOpen=MIN(hFacW(i,j,k,bi,bj),
     &                  hFacW(i,j-1,k,bi,bj))
          hFacZOpen=MIN(hFacS(i-1,j,k,bi,bj),hFacZOpen)
          hFacZ(i,j)=hFacZOpen
         ELSE
          IF ( myFace.EQ.4 ) THEN
            hFacZOpen=
     &               ( hFacS(i-1,j,k,bi,bj)
     &                +hFacW(i,j-1,k,bi,bj) )
     &               + hFacW(i, j ,k,bi,bj)
          ELSEIF ( myFace.EQ.6 ) THEN
            hFacZOpen=
     &               ( hFacW(i,j-1,k,bi,bj)
     &                +hFacW(i, j ,k,bi,bj) )
     &               + hFacS(i-1,j,k,bi,bj)
          ELSE
            hFacZOpen=
     &               ( hFacW(i, j ,k,bi,bj)
     &                +hFacS(i-1,j,k,bi,bj) )
     &               + hFacW(i,j-1,k,bi,bj)
          ENDIF
          hFacZ(i,j) = hFacZOpen / 3.d0
         ENDIF
        ENDIF
        IF ( northWestCorner ) THEN
         i=1
         j=sNy+1
         IF ( hZoption.EQ.1 ) THEN
          hFacZOpen=MIN(hFacW(i,j,k,bi,bj),
     &                  hFacW(i,j-1,k,bi,bj))
          hFacZOpen=MIN(hFacS(i,j,k,bi,bj),hFacZOpen)
          hFacZ(i,j)=hFacZOpen
         ELSE
          IF ( myFace.EQ.1 ) THEN
            hFacZOpen=
     &               ( hFacS( i ,j,k,bi,bj)
     &                +hFacW(i, j ,k,bi,bj) )
     &               + hFacW(i,j-1,k,bi,bj)
          ELSEIF ( myFace.EQ.5 ) THEN
            hFacZOpen=
     &               ( hFacW(i, j ,k,bi,bj)
     &                +hFacW(i,j-1,k,bi,bj) )
     &               + hFacS( i ,j,k,bi,bj)
          ELSE
            hFacZOpen=
     &               ( hFacW(i,j-1,k,bi,bj)
     &                +hFacS( i ,j,k,bi,bj) )
     &               + hFacW(i, j ,k,bi,bj)
          ENDIF
          hFacZ(i,j) = hFacZOpen / 3.d0
         ENDIF
        ENDIF
        IF ( northEastCorner ) THEN
         i=sNx+1
         j=sNy+1
         IF ( hZoption.EQ.1 ) THEN
          hFacZOpen=MIN(hFacW(i,j,k,bi,bj),
     &                  hFacW(i,j-1,k,bi,bj))
          hFacZOpen=MIN(hFacS(i-1,j,k,bi,bj),hFacZOpen)
          hFacZ(i,j)=hFacZOpen
         ELSE
          IF ( MOD(myFace,2).EQ.1 ) THEN
            hFacZOpen=
     &               ( hFacW(i,j-1,k,bi,bj)
     &                +hFacW(i, j ,k,bi,bj) )
     &               + hFacS(i-1,j,k,bi,bj)
          ELSE
            hFacZOpen=
     &               ( hFacW(i, j ,k,bi,bj)
     &                +hFacS(i-1,j,k,bi,bj) )
     &               + hFacW(i,j-1,k,bi,bj)
          ENDIF
          hFacZ(i,j) = hFacZOpen / 3.d0
         ENDIF
        ENDIF
      ENDIF
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
        IF (hFacZ(i,j).EQ.0.) THEN
         r_hFacZ(i,j) = 0.
        ELSE
         r_hFacZ(i,j) = 1.d0/hFacZ(i,j)
        ENDIF
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_CALC_KE(
     I        bi,bj,k,KEscheme,
     I        uFld, vFld,
     O        KE,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER KEscheme
      INTEGER myThid
      Real*8 KE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER I,J
C
      IF (KEscheme.EQ.-1) THEN
       DO J=1-OLy,sNy+OLy-1
        DO I=1-OLx,sNx+OLx-1
         KE(i,j) = 0.125*(
     &             ( uFld(i,j)+uFld(i+1, j ) )**2
     &            +( vFld(i,j)+vFld( i ,j+1) )**2 )
       ENDDO
      ENDDO
      ELSEIF (KEscheme.EQ.0) THEN
C
       DO J=1-OLy,sNy+OLy-1
        DO I=1-OLx,sNx+OLx-1
         KE(i,j) = 0.25*(
     &           ( uFld( i , j )*uFld( i , j )
     &            +uFld(i+1, j )*uFld(i+1, j ) )
     &         + ( vFld( i , j )*vFld( i , j )
     &            +vFld( i ,j+1)*vFld( i ,j+1) )
     &                  )
        ENDDO
       ENDDO
      ELSEIF (KEscheme.EQ.1) THEN
       DO J=1-OLy,sNy+OLy-1
        DO I=1-OLx,sNx+OLx-1
         KE(i,j) = 0.25*(
     &           ( uFld(i, j )*uFld(i, j )*rAw(i ,j, bi,bj)
     &            +uFld(i+1,j)*uFld(i+1,j)*rAw(i+1,j,bi,bj) )
     &         + ( vFld(i, j )*vFld(i, j )*rAs(i ,j, bi,bj)
     &            +vFld(i,j+1)*vFld(i,j+1)*rAs(i,j+1,bi,bj) )
     &                  )*recip_rA(i,j,bi,bj)
        ENDDO
       ENDDO
      ELSEIF (KEscheme.EQ.2) THEN
       DO J=1-OLy,sNy+OLy-1
        DO I=1-OLx,sNx+OLx-1
         KE(i,j) = 0.25*(
     &           ( uFld( i , j )*uFld( i , j )*hFacW(i,j,k,bi,bj)
     &            +uFld(i+1, j )*uFld(i+1, j )*hFacW(i+1,j,k,bi,bj) )
     &         + ( vFld( i , j )*vFld( i , j )*hFacS(i,j,k,bi,bj)
     &            +vFld( i ,j+1)*vFld( i ,j+1)*hFacS(i,j+1,k,bi,bj) )
     &            )*recip_hFacC(i,j,k,bi,bj)
        ENDDO
       ENDDO
      ELSEIF (KEscheme.EQ.3) THEN
       DO J=1-OLy,sNy+OLy-1
        DO I=1-OLx,sNx+OLx-1
         KE(i,j) = 0.25*(
     &           (
     &    uFld(i, j )*uFld(i, j )
     &        *hFacW(i ,j, k,bi,bj)*rAw(i ,j, bi,bj)
     &   +uFld(i+1,j)*uFld(i+1,j)
     &        *hFacW(i+1,j,k,bi,bj)*rAw(i+1,j,bi,bj)
     &           )  
     &         + (
     &    vFld(i, j )*vFld(i, j )
     &        *hFacS(i, j, k,bi,bj)*rAs(i ,j, bi,bj)
     &   +vFld(i,j+1)*vFld(i,j+1)
     &        *hFacS(i,j+1,k,bi,bj)*rAs(i,j+1,bi,bj)
     &           )      )*recip_hFacC(i,j,k,bi,bj)
     &                   * recip_rA(i,j,bi,bj)
        ENDDO
       ENDDO
      ELSE
       STOP 'S/R MOM_CALC_KE: We should never reach this point!'
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_CALC_RELVORT3(
     I        bi,bj,k,
     I        uFld, vFld, hFacZ,
     O        vort3,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vort3(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      INTEGER i,j
      LOGICAL northWestCorner, northEastCorner,
     &        southWestCorner, southEastCorner
      INTEGER myFace
      DO J=1-Oly,sNy+Oly
       DO I=1-Olx,sNx+Olx
        vort3(I,J) = 0.d0
       ENDDO
      ENDDO
      DO J=2-Oly,sNy+Oly
       DO I=2-Olx,sNx+Olx
        vort3(I,J)=
     &      recip_rAz(I,J,bi,bj)*(
     &      ( vFld(I,J)*dyC(I,J,bi,bj)
     &       -vFld(I-1,J)*dyC(I-1,J,bi,bj) )
     &     -( uFld(I,J)*dxC(I,J,bi,bj)
     &       -uFld(I,J-1)*dxC(I,J-1,bi,bj) )
     &                           )
       ENDDO
      ENDDO
      IF (useCubedSphereExchange) THEN
       myFace = bi
       southWestCorner = .TRUE.
       southEastCorner = .TRUE.
       northWestCorner = .TRUE.
       northEastCorner = .TRUE.
       IF ( southWestCorner ) THEN
         I=1
         J=1
         vort3(I,J)=
     &     +recip_rAz(I,J,bi,bj)*(
     &      ( vFld(I,J)*dyC(I,J,bi,bj)
     &       -uFld(I,J)*dxC(I,J,bi,bj) )
     &      + uFld(I,J-1)*dxC(I,J-1,bi,bj)
     &     )
       ENDIF
       IF ( southEastCorner ) THEN
         I=sNx+1
         J=1
         IF ( myFace.EQ.2 ) THEN
          vort3(I,J)=
     &     +recip_rAz(I,J,bi,bj)*(
     &      (-uFld(I,J)*dxC(I,J,bi,bj)
     &       -vFld(I-1,J)*dyC(I-1,J,bi,bj) )
     &      + uFld(I,J-1)*dxC(I,J-1,bi,bj)
     &     )
         ELSEIF ( myFace.EQ.4 ) THEN
          vort3(I,J)=
     &     +recip_rAz(I,J,bi,bj)*(
     &      (-vFld(I-1,J)*dyC(I-1,J,bi,bj)
     &       +uFld(I,J-1)*dxC(I,J-1,bi,bj) )
     &      - uFld(I,J)*dxC(I,J,bi,bj)
     &     )
         ELSE
          vort3(I,J)=
     &     +recip_rAz(I,J,bi,bj)*(
     &      (+uFld(I,J-1)*dxC(I,J-1,bi,bj)
     &       -uFld(I,J)*dxC(I,J,bi,bj)     )
     &      - vFld(I-1,J)*dyC(I-1,J,bi,bj)
     &     )
         ENDIF
       ENDIF
       IF ( northWestCorner ) THEN
         I=1
         J=sNy+1
         IF ( myFace.EQ.1 ) THEN
          vort3(I,J)=
     &     +recip_rAz(I,J,bi,bj)*(
     &      (+uFld(I,J-1)*dxC(I,J-1,bi,bj)
     &       +vFld(I,J)*dyC(I,J,bi,bj)     )
     &       -uFld(I,J)*dxC(I,J,bi,bj)
     &     )
         ELSEIF ( myFace.EQ.3 ) THEN
          vort3(I,J)=
     &     +recip_rAz(I,J,bi,bj)*(
     &      (-uFld(I,J)*dxC(I,J,bi,bj)
     &       +uFld(I,J-1)*dxC(I,J-1,bi,bj) )
     &      + vFld(I,J)*dyC(I,J,bi,bj)
     &     )
         ELSE
          vort3(I,J)=
     &     +recip_rAz(I,J,bi,bj)*(
     &      (+vFld(I,J)*dyC(I,J,bi,bj)
     &       -uFld(I,J)*dxC(I,J,bi,bj)     )
     &      + uFld(I,J-1)*dxC(I,J-1,bi,bj)
     &     )
         ENDIF
       ENDIF
       IF ( northEastCorner ) THEN
         I=sNx+1
         J=sNy+1
         IF ( MOD(myFace,2).EQ.1 ) THEN
          vort3(I,J)=
     &     +recip_rAz(I,J,bi,bj)*(
     &      (-uFld(I,J)*dxC(I,J,bi,bj)
     &       -vFld(I-1,J)*dyC(I-1,J,bi,bj) )
     &      + uFld(I,J-1)*dxC(I,J-1,bi,bj)
     &     )
         ELSE
          vort3(I,J)=
     &     +recip_rAz(I,J,bi,bj)*(
     &      (+uFld(I,J-1)*dxC(I,J-1,bi,bj)
     &       -uFld(I,J)*dxC(I,J,bi,bj)     )
     &      - vFld(I-1,J)*dyC(I-1,J,bi,bj)
     &     )
         ENDIF
       ENDIF
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_CALC_STRAIN( 
     I        bi,bj,k,
     I        uFld, vFld, hFacZ,
     O        strain,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 strain(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      DO J=2-Oly,sNy+Oly
       DO I=2-Olx,sNx+Olx
        strain(I,J)=
     &    ( dyc( i , j ,bi,bj)*vFld( i , j )
     &     -dyc(i-1, j ,bi,bj)*vFld(i-1, j )
     &     +dxc( i , j ,bi,bj)*uFld( i , j )
     &     -dxc( i ,j-1,bi,bj)*uFld( i ,j-1) )*recip_rAz(i,j,bi,bj)
       ENDDO
      ENDDO
        
      IF (useCubedSphereExchange) THEN
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_CALC_TENSION( 
     I        bi,bj,k,
     I        uFld, vFld,
     O        tension,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 tension(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      DO j=1-Oly,sNy+Oly-1
       DO i=1-Olx,sNx+Olx-1
        tension(i,j)= 
     &    ( dyg(i+1, j ,bi,bj)*uFld(i+1, j )
     &     -dyg( i , j ,bi,bj)*uFld( i , j )
     &     -dxg( i ,j+1,bi,bj)*vFld( i ,j+1)
     &     +dxg( i , j ,bi,bj)*vFld( i , j ) )*recip_rA(i,j,bi,bj)
       ENDDO
      ENDDO
        
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_CALC_VISC(
     I        bi,bj,k,
     O        viscAh_Z,viscAh_D,viscA4_Z,viscA4_D,
     O        harmonic,biharmonic,useVariableViscosity,
     I        hDiv,vort3,tension,strain,KE,hFacZ,
     I        myThid)
      IMPLICIT NONE
C
C
C
C
C
C
C
C
C
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      COMMON /MOM_VISC_L/ L2_D, L2_Z,
     &                    L3_D, L3_Z,
     &                    L4rdt_D, L4rdt_Z,
     &                    recip_dt
      Real*8 L2_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 L2_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 L3_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 L3_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 L4rdt_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 L4rdt_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dt
      INTEGER bi,bj,k
      Real*8 viscAh_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hDiv(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vort3(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tension(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 strain(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 KE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      LOGICAL harmonic,biharmonic,useVariableViscosity
      INTEGER I,J
      INTEGER lockey_1, lockey_2
      Real*8 smag2fac, smag4fac
      Real*8 leith2fac, leith4fac
      Real*8 leithD2fac, leithD4fac
      Real*8 viscAhRe_max, viscA4Re_max
      Real*8 Alin,grdVrt,grdDiv, keZpt
      Real*8 L2,L3,L5,L2rdt,L4rdt
      Real*8 Uscl,U4scl
      Real*8 divDx(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 divDy(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vrtDx(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vrtDy(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_ZMax(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_DMax(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_ZMax(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_DMax(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_ZMin(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_DMin(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_ZMin(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_DMin(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_ZLth(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_DLth(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_ZLth(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_DLth(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_ZLthD(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_DLthD(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_ZLthD(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_DLthD(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_ZSmg(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_DSmg(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_ZSmg(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_DSmg(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      LOGICAL calcLeith, calcSmag
          act1 = bi - myBxLo(myThid)
          max1 = myBxHi(myThid) - myBxLo(myThid) + 1
          act2 = bj - myByLo(myThid)
          max2 = myByHi(myThid) - myByLo(myThid) + 1
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = ikey_dynamics - 1
          ikey = (act1 + 1) + act2*max1
     &                      + act3*max1*max2
     &                      + act4*max1*max2*max3
          lockey_1 = (ikey-1)*Nr + k
      useVariableViscosity=
     &      (viscAhGrid.NE.0.)
     &  .OR.(viscA4Grid.NE.0.)
     &  .OR.(viscC2leith.NE.0.)
     &  .OR.(viscC2leithD.NE.0.)
     &  .OR.(viscC4leith.NE.0.)
     &  .OR.(viscC4leithD.NE.0.)
     &  .OR.(viscC2smag.NE.0.)
     &  .OR.(viscC4smag.NE.0.)
      harmonic=
     &      (viscAh.NE.0.)
     &  .OR.(viscAhD.NE.0.)
     &  .OR.(viscAhZ.NE.0.)
     &  .OR.(viscAhGrid.NE.0.)
     &  .OR.(viscC2leith.NE.0.)
     &  .OR.(viscC2leithD.NE.0.)
     &  .OR.(viscC2smag.NE.0.)
      biharmonic=
     &      (viscA4.NE.0.)
     &  .OR.(viscA4D.NE.0.)
     &  .OR.(viscA4Z.NE.0.)
     &  .OR.(viscA4Grid.NE.0.)
     &  .OR.(viscC4leith.NE.0.)
     &  .OR.(viscC4leithD.NE.0.)
     &  .OR.(viscC4smag.NE.0.)
      IF (useVariableViscosity) THEN
       IF ((harmonic).AND.(viscAhReMax.NE.0.)) THEN
        viscAhRe_max=SQRT(2.d0)/viscAhReMax
       ELSE
        viscAhRe_max=0.d0
       ENDIF
       IF ((biharmonic).AND.(viscA4ReMax.NE.0.)) THEN
        viscA4Re_max=0.125d0*SQRT(2.d0)/viscA4ReMax
       ELSE
        viscA4Re_max=0.d0
       ENDIF
       calcLeith=
     &      (viscC2leith.NE.0.)
     &  .OR.(viscC2leithD.NE.0.)
     &  .OR.(viscC4leith.NE.0.)
     &  .OR.(viscC4leithD.NE.0.)
       calcSmag=
     &      (viscC2smag.NE.0.)
     &  .OR.(viscC4smag.NE.0.)
       IF (calcSmag) THEN
        smag2fac=(viscC2smag/pi)**2
        smag4fac=0.125d0*(viscC4smag/pi)**2
       ELSE
        smag2fac=0.d0
        smag4fac=0.d0
       ENDIF
       IF (calcLeith) THEN
        IF (useFullLeith) THEN
         leith2fac =(viscC2leith /pi)**6
         leithD2fac=(viscC2leithD/pi)**6
         leith4fac =0.015625d0*(viscC4leith /pi)**6
         leithD4fac=0.015625d0*(viscC4leithD/pi)**6
        ELSE
         leith2fac =(viscC2leith /pi)**3
         leithD2fac=(viscC2leithD/pi)**3
         leith4fac =0.125d0*(viscC4leith /pi)**3
         leithD4fac=0.125d0*(viscC4leithD/pi)**3
        ENDIF
       ELSE
        leith2fac=0.d0
        leith4fac=0.d0
        leithD2fac=0.d0
        leithD4fac=0.d0
       ENDIF
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
          viscAh_D(i,j)=viscAhD
          viscAh_Z(i,j)=viscAhZ
          viscA4_D(i,j)=viscA4D
          viscA4_Z(i,j)=viscA4Z
c
          visca4_zsmg(i,j) = 0.d0
          viscah_zsmg(i,j) = 0.d0
c
          viscAh_Dlth(i,j) = 0.d0
          viscA4_Dlth(i,j) = 0.d0
          viscAh_DlthD(i,j)= 0.d0
          viscA4_DlthD(i,j)= 0.d0
c
          viscAh_DSmg(i,j) = 0.d0
          viscA4_DSmg(i,j) = 0.d0
c
          viscAh_ZLth(i,j) = 0.d0
          viscA4_ZLth(i,j) = 0.d0
          viscAh_ZLthD(i,j)= 0.d0
          viscA4_ZLthD(i,j)= 0.d0
        ENDDO
       ENDDO
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
          divDx(i,j) = 0.
          divDy(i,j) = 0.
          vrtDx(i,j) = 0.
          vrtDy(i,j) = 0.
        ENDDO
       ENDDO
       IF (calcLeith) THEN
         IF (useCubedSphereExchange) THEN
           CALL FILL_CS_CORNER_TR_RL( 1, .FALSE.,
     &                                hDiv, bi,bj, myThid )
         ENDIF
         DO j=2-Oly,sNy+Oly-1
          DO i=2-Olx,sNx+Olx-1
            divDx(i,j) = (hDiv(i,j)-hDiv(i-1,j))*recip_DXC(i,j,bi,bj)
          ENDDO
         ENDDO
         IF (useCubedSphereExchange) THEN
           CALL FILL_CS_CORNER_TR_RL( 2, .FALSE.,
     &                                hDiv, bi,bj, myThid )
         ENDIF
         DO j=2-Oly,sNy+Oly-1
          DO i=2-Olx,sNx+Olx-1
            divDy(i,j) = (hDiv(i,j)-hDiv(i,j-1))*recip_DYC(i,j,bi,bj)
          ENDDO
         ENDDO
         DO j=2-Oly,sNy+Oly
          DO i=2-Olx,sNx+Olx-1
            vrtDx(i,j) = (vort3(i+1,j)-vort3(i,j))
     &                  *recip_DXG(i,j,bi,bj)
     &                  *maskS(i,j,k,bi,bj)
          ENDDO
         ENDDO
         DO j=2-Oly,sNy+Oly-1
          DO i=2-Olx,sNx+Olx
            vrtDy(i,j) = (vort3(i,j+1)-vort3(i,j))
     &                  *recip_DYG(i,j,bi,bj)
     &                  *maskW(i,j,k,bi,bj)
          ENDDO
         ENDDO
       ENDIF
       DO j=2-Oly,sNy+Oly-1
        DO i=2-Olx,sNx+Olx-1
CCCCCCCCCCCCCCC Divergence Point CalculationsCCCCCCCCCCCCCCCCCCCC
           lockey_2 = i+olx + (sNx+2*olx)*(j+oly-1)
     &                      + (sNx+2*olx)*(sNy+2*oly)*(lockey_1-1)
CADJ STORE viscA4_ZSmg(i,j) 
CADJ &     = comlev1_mom_ijk_loop , key=lockey_2, byte=isbyte
CADJ STORE viscAh_ZSmg(i,j) 
CADJ &     = comlev1_mom_ijk_loop , key=lockey_2, byte=isbyte
         L2 = L2_D(i,j,bi,bj)
         L2rdt = 0.25d0*recip_dt*L2
         L3 = L3_D(i,j,bi,bj)
         L4rdt = L4rdt_D(i,j,bi,bj)
         L5 = (L2*L3)
         IF ( viscAhRe_max.GT.0. .AND. KE(i,j).GT.0. ) THEN
           Uscl=SQRT(KE(i,j)*L2)*viscAhRe_max
         ELSE
           Uscl=0.
         ENDIF
         IF ( viscA4Re_max.GT.0. .AND. KE(i,j).GT.0. ) THEN
           U4scl=SQRT(KE(i,j))*L3*viscA4Re_max
         ELSE
           U4scl=0.
         ENDIF
         IF (useFullLeith.AND.calcLeith) THEN
          grdVrt=0.25d0*( (vrtDx(i,j+1)*vrtDx(i,j+1)
     &                        + vrtDx(i,j)*vrtDx(i,j) )
     &                     + (vrtDy(i+1,j)*vrtDy(i+1,j)
     &                        + vrtDy(i,j)*vrtDy(i,j) )  )
          grdDiv=0.25d0*( (divDx(i+1,j)*divDx(i+1,j)
     &                        + divDx(i,j)*divDx(i,j) )
     &                     + (divDy(i,j+1)*divDy(i,j+1)
     &                        + divDy(i,j)*divDy(i,j) )  )
          viscAh_DLth(i,j)=
     &     SQRT(leith2fac*grdVrt+leithD2fac*grdDiv)*L3
          viscA4_DLth(i,j)=
     &     SQRT(leith4fac*grdVrt+leithD4fac*grdDiv)*L5
          viscAh_DLthd(i,j)=
     &     SQRT(leithD2fac*grdDiv)*L3
          viscA4_DLthd(i,j)=
     &     SQRT(leithD4fac*grdDiv)*L5
         ELSEIF (calcLeith) THEN
          grdVrt=MAX( ABS(vrtDx(i,j+1)), ABS(vrtDx(i,j)) )
          grdVrt=MAX( grdVrt, ABS(vrtDy(i+1,j)) )
          grdVrt=MAX( grdVrt, ABS(vrtDy(i,j))   )
          grdDiv=MAX( ABS(divDx(i+1,j)), ABS(divDx(i,j)) )
          grdDiv=MAX( grdDiv, ABS(divDy(i,j+1)) )
          grdDiv=MAX( grdDiv, ABS(divDy(i,j))   )
          viscAh_Dlth(i,j)=(leith2fac*grdVrt+(leithD2fac*grdDiv))*L3
          viscA4_Dlth(i,j)=(leith4fac*grdVrt+(leithD4fac*grdDiv))*L5
          viscAh_DlthD(i,j)=((leithD2fac*grdDiv))*L3
          viscA4_DlthD(i,j)=((leithD4fac*grdDiv))*L5
         ELSE
          viscAh_Dlth(i,j)=0.d0
          viscA4_Dlth(i,j)=0.d0
          viscAh_DlthD(i,j)=0.d0
          viscA4_DlthD(i,j)=0.d0
         ENDIF
         IF (calcSmag) THEN
          viscAh_DSmg(i,j)=L2
     &       *SQRT(tension(i,j)**2
     &       +0.25d0*(strain(i+1, j )**2+strain( i ,j+1)**2
     &                  +strain(i  , j )**2+strain(i+1,j+1)**2))
          viscA4_DSmg(i,j)=smag4fac*L2*viscAh_DSmg(i,j)
          viscAh_DSmg(i,j)=smag2fac*viscAh_DSmg(i,j)
         ELSE
          viscAh_DSmg(i,j)=0.d0
          viscA4_DSmg(i,j)=0.d0
         ENDIF
         Alin=viscAhD+viscAhGrid*L2rdt
     &          +viscAh_DLth(i,j)+viscAh_DSmg(i,j)
         viscAh_DMin(i,j)=MAX(viscAhGridMin*L2rdt,Uscl)
         viscAh_D(i,j)=MAX(viscAh_DMin(i,j),Alin)
         viscAh_DMax(i,j)=MIN(viscAhGridMax*L2rdt,viscAhMax)
         viscAh_D(i,j)=MIN(viscAh_DMax(i,j),viscAh_D(i,j))
         Alin=viscA4D+viscA4Grid*L4rdt
     &          +viscA4_DLth(i,j)+viscA4_DSmg(i,j)
         viscA4_DMin(i,j)=MAX(viscA4GridMin*L4rdt,U4scl)
         viscA4_D(i,j)=MAX(viscA4_DMin(i,j),Alin)
         viscA4_DMax(i,j)=MIN(viscA4GridMax*L4rdt,viscA4Max)
         viscA4_D(i,j)=MIN(viscA4_DMax(i,j),viscA4_D(i,j))
CCCCCCCCCCCCC Vorticity Point CalculationsCCCCCCCCCCCCCCCCCC
         L2 = L2_Z(i,j,bi,bj)
         L2rdt = 0.25d0*recip_dt*L2
         L3 = L3_Z(i,j,bi,bj)
         L4rdt = L4rdt_Z(i,j,bi,bj)
         L5 = (L2*L3)
         IF ( viscAhRe_max.GT.0. .OR. viscA4Re_max.GT.0. ) THEN
           keZpt=0.25d0*( (KE(i,j)+KE(i-1,j-1))
     &                      +(KE(i-1,j)+KE(i,j-1)) )
           IF ( keZpt.GT.0. ) THEN
             Uscl = SQRT(keZpt*L2)*viscAhRe_max
             U4scl= SQRT(keZpt)*L3*viscA4Re_max
           ELSE
             Uscl =0.
             U4scl=0.
           ENDIF
         ELSE
           Uscl =0.
           U4scl=0.
         ENDIF
         IF (useFullLeith.AND.calcLeith) THEN
          grdVrt=0.25d0*( (vrtDx(i-1,j)*vrtDx(i-1,j)
     &                        + vrtDx(i,j)*vrtDx(i,j) )
     &                     + (vrtDy(i,j-1)*vrtDy(i,j-1)
     &                        + vrtDy(i,j)*vrtDy(i,j) )  )
          grdDiv=0.25d0*( (divDx(i,j-1)*divDx(i,j-1)
     &                        + divDx(i,j)*divDx(i,j) )
     &                     + (divDy(i-1,j)*divDy(i-1,j)
     &                        + divDy(i,j)*divDy(i,j) )  )
          viscAh_ZLth(i,j)=
     &     SQRT(leith2fac*grdVrt+leithD2fac*grdDiv)*L3
          viscA4_ZLth(i,j)=
     &     SQRT(leith4fac*grdVrt+leithD4fac*grdDiv)*L5
          viscAh_ZLthD(i,j)=
     &     SQRT(leithD2fac*grdDiv)*L3
          viscA4_ZLthD(i,j)=
     &     SQRT(leithD4fac*grdDiv)*L5
         ELSEIF (calcLeith) THEN
          grdVrt=MAX( ABS(vrtDx(i-1,j)), ABS(vrtDx(i,j)) )
          grdVrt=MAX( grdVrt, ABS(vrtDy(i,j-1)) )
          grdVrt=MAX( grdVrt, ABS(vrtDy(i,j))   )
          grdDiv=MAX( ABS(divDx(i,j)), ABS(divDx(i,j-1)) )
          grdDiv=MAX( grdDiv, ABS(divDy(i,j))   )
          grdDiv=MAX( grdDiv, ABS(divDy(i-1,j)) )
          viscAh_ZLth(i,j)=(leith2fac*grdVrt+(leithD2fac*grdDiv))*L3
          viscA4_ZLth(i,j)=(leith4fac*grdVrt+(leithD4fac*grdDiv))*L5
          viscAh_ZLthD(i,j)=(leithD2fac*grdDiv)*L3
          viscA4_ZLthD(i,j)=(leithD4fac*grdDiv)*L5
         ELSE
          viscAh_ZLth(i,j)=0.d0
          viscA4_ZLth(i,j)=0.d0
          viscAh_ZLthD(i,j)=0.d0
          viscA4_ZLthD(i,j)=0.d0
         ENDIF
         IF (calcSmag) THEN
          viscAh_ZSmg(i,j)=L2
     &      *SQRT(strain(i,j)**2
     &        +0.25d0*(tension( i , j )**2+tension( i ,j-1)**2
     &                   +tension(i-1, j )**2+tension(i-1,j-1)**2))
          viscA4_ZSmg(i,j)=smag4fac*L2*viscAh_ZSmg(i,j)
          viscAh_ZSmg(i,j)=smag2fac*viscAh_ZSmg(i,j)
         ENDIF
         Alin=viscAhZ+viscAhGrid*L2rdt
     &           +viscAh_ZLth(i,j)+viscAh_ZSmg(i,j)
         viscAh_ZMin(i,j)=MAX(viscAhGridMin*L2rdt,Uscl)
         viscAh_Z(i,j)=MAX(viscAh_ZMin(i,j),Alin)
         viscAh_ZMax(i,j)=MIN(viscAhGridMax*L2rdt,viscAhMax)
         viscAh_Z(i,j)=MIN(viscAh_ZMax(i,j),viscAh_Z(i,j))
         Alin=viscA4Z+viscA4Grid*L4rdt
     &           +viscA4_ZLth(i,j)+viscA4_ZSmg(i,j)
         viscA4_ZMin(i,j)=MAX(viscA4GridMin*L4rdt,U4scl)
         viscA4_Z(i,j)=MAX(viscA4_ZMin(i,j),Alin)
         viscA4_ZMax(i,j)=MIN(viscA4GridMax*L4rdt,viscA4Max)
         viscA4_Z(i,j)=MIN(viscA4_ZMax(i,j),viscA4_Z(i,j))
        ENDDO
       ENDDO
      ELSE
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         viscAh_D(i,j)=viscAhD
         viscAh_Z(i,j)=viscAhZ
         viscA4_D(i,j)=viscA4D
         viscA4_Z(i,j)=viscA4Z
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_HDISSIP(
     I        bi,bj,k,
     I        hDiv,vort3,tension,strain,KE,
     I        hFacZ,
     I        viscAh_s,viscAh_t,viscA4_s,viscA4_t,
     I        harmonic,biharmonic,useVariableViscosity,
     O        uDissip,vDissip,
     I        myThid)
      IMPLICIT NONE
C
C
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER bi,bj,k
      Real*8 hDiv(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vort3(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tension(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 strain(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 KE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uDissip(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vDissip(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_s(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_t(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_s(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_t(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      LOGICAL harmonic, biharmonic, useVariableViscosity
      INTEGER myThid
      INTEGER I,J
      IF (harmonic) THEN
       DO j=2-Oly,sNy+Oly-1
        DO i=2-Olx,sNx+Olx-1
         uDissip(i,j) = 
     &    recip_dyg(i,j,bi,bj)*recip_dyg(i,j,bi,bj)
     &    *recip_dxc(i,j,bi,bj)
     &    *(
     &       dyf( i , j ,bi,bj)*dyf( i , j ,bi,bj)
     &         *viscAh_t( i , j )*tension( i , j )
     &      -dyf(i-1, j ,bi,bj)*dyf(i-1, j ,bi,bj)
     &         *viscAh_t(i-1, j )*tension(i-1, j )
     &     )
     &    +recip_dxc(i,j,bi,bj)*recip_dxc(i,j,bi,bj)
     &    *recip_dyg(i,j,bi,bj)
     &    *(
     &       dxv( i ,j+1,bi,bj)*dxv( i ,j+1,bi,bj)
     &         *viscAh_s(i,j+1)*strain( i ,j+1)
     &      -dxv( i , j ,bi,bj)*dxv( i , j ,bi,bj)
     &         *viscAh_s(i, j )*strain( i , j )
     &     )
         vDissip(i,j) = 
     &    recip_dyc(i,j,bi,bj)*recip_dyc(i,j,bi,bj)
     &    *recip_dxg(i,j,bi,bj)
     &    *(
     &       dyu(i+1, j ,bi,bj)*dyu(i+1, j ,bi,bj)
     &         *viscAh_s(i+1,j)*strain(i+1,j)
     &      -dyu( i , j ,bi,bj)*dyu( i , j ,bi,bj)
     &         *viscAh_s( i ,j)*strain( i ,j)
     &     )
     &    -recip_dxg(i,j,bi,bj)*recip_dxg(i,j,bi,bj)
     &    *recip_dyc(i,j,bi,bj)
     &    *(
     &       dxf( i , j ,bi,bj)*dxf( i , j ,bi,bj)
     &         *viscAh_t(i, j )*tension(i, j )
     &      -dxf( i ,j-1,bi,bj)*dxf( i ,j-1,bi,bj)
     &         *viscAh_t(i,j-1)*tension(i,j-1)
     &     )
        ENDDO
       ENDDO
      ENDIF
      IF (biharmonic) THEN
       STOP 'MOM_HDISSIP: BIHARMONIC NOT ALLOWED WITH STRAIN-TENSION'
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_QUASIHYDROSTATIC(
     I                bi,bj,k,
     I                uFld, vFld,
     O                effectiveBuoy,
     I                myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      Real*8 effectiveBuoy(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      INTEGER iMin,iMax,jMin,jMax
      PARAMETER( iMin = 0 , iMax = sNx+1 )
      PARAMETER( jMin = 0 , jMax = sNy+1 )
      INTEGER i,j
      Real*8 scalingFactor
      scalingFactor=rhoConst*gravitySign*recip_gravity
      IF ( use3dCoriolis ) THEN
       DO j=jMin,jMax
        DO i=iMin,iMax
         effectiveBuoy(i,j)=effectiveBuoy(i,j)
     &    +scalingFactor*
     &     fCoriCos(i,j,bi,bj)*
     &       ( angleCosC(i,j,bi,bj)*0.5d0 *
     &                (uFld(i,j,k,bi,bj)+uFld(i+1,j,k,bi,bj))
     &        -angleSinC(i,j,bi,bj)*0.5d0 *
     &                (vFld(i,j,k,bi,bj)+vFld(i,j+1,k,bi,bj))
     &       )
        ENDDO
       ENDDO
      ENDIF
      IF ( useNHMTerms ) THEN
       DO j=jMin,jMax
        DO i=iMin,iMax
         effectiveBuoy(i,j)=effectiveBuoy(i,j)
     &    +scalingFactor*
     &     (   (uFld( i ,j,k,bi,bj)*uFld( i ,j,k,bi,bj)
     &         +uFld(i+1,j,k,bi,bj)*uFld(i+1,j,k,bi,bj))
     &       + (vFld(i, j ,k,bi,bj)*vFld(i, j ,k,bi,bj)
     &         +vFld(i,j+1,k,bi,bj)*vFld(i,j+1,k,bi,bj))
     &     )* 0.5d0 * recip_rSphere*recip_deepFacC(k)
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_U_CORIOLIS_NH(
     I               bi,bj,k,wFld,
     O               uCoriolisTerm,
     I               myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 wFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      Real*8 uCoriolisTerm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j,kp1
      Real*8 wMsk
      kp1=min(k+1,Nr)
      wMsk=1.
      IF (k.EQ.Nr) wMsk=0.
      DO j=1-Oly,sNy+Oly
       DO i=2-Olx,sNx+Olx
        uCoriolisTerm(i,j) =
     &    0.5*( fCoriCos( i ,j,bi,bj)*angleCosC( i ,j,bi,bj)
     &         *0.5*( wFld( i ,j, k ,bi,bj)*rVel2wUnit( k )
     &               +wFld( i ,j,kp1,bi,bj)*rVel2wUnit(kp1)*wMsk )
     &        + fCoriCos(i-1,j,bi,bj)*angleCosC(i-1,j,bi,bj)
     &         *0.5*( wFld(i-1,j, k ,bi,bj)*rVel2wUnit( k )
     &               +wFld(i-1,j,kp1,bi,bj)*rVel2wUnit(kp1)*wMsk )
     &        )*gravitySign
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_U_METRIC_NH(
     I               bi,bj,k,
     I               uFld, wFld,
     O               uMetricTerms,
     I               myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 wFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      Real*8 uMetricTerms(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j,kp1
      Real*8 wVelBottomOverride
      kp1=min(k+1,Nr)
      wVelBottomOverride=1.
      IF (k.EQ.Nr) wVelBottomOverride=0.
      DO j=1-Olx,sNy+Oly
       DO i=1-Olx+1,sNx+Olx
         uMetricTerms(i,j) = uFld(i,j)*recip_rSphere*recip_deepFacC(k)
     &    *0.25*( (wFld(i-1,j,kp1,bi,bj)+wFld(i,j,kp1,bi,bj))
     &            *rVel2wUnit(kp1)*wVelBottomOverride
     &          + (wFld(i-1,j, k ,bi,bj)+wFld(i,j, k ,bi,bj))
     &            *rVel2wUnit( k )
     &          )*gravitySign
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_U_BOTTOMDRAG(
     I        bi,bj,k,
     I        uFld, KE, KappaRU,
     O        uDragTerms,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 KE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 KappaRU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      INTEGER myThid
      Real*8 uDragTerms(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j,kDown,kDownC,kBottom
      Real*8 viscFac, dragFac
      Real*8 rdrckp1, maskDown
      IF ( usingZCoords ) THEN
       kBottom = Nr
       kDown   = min(k+1,kBottom)
       kDownC  = kDown
       dragFac = 1.d0
      ELSE
       kBottom = 1
       kDown   = max(k-1,kBottom)
       kDownC  = k
       dragFac = mass2rUnit*rhoConst
      ENDIF
      rdrckp1=recip_drC(kDownC)
      IF (k.EQ.kBottom) rdrckp1=recip_drF(k)
      viscFac=0.
      IF (no_slip_bottom) viscFac=1.
      DO j=1-Oly,sNy+Oly-1
       DO i=1-Olx+1,sNx+Olx-1
        maskDown=maskW(i,j,kDown,bi,bj)
        IF (k.EQ.kBottom) maskDown=0.
        uDragTerms(i,j)=
     &   -recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
     &   *(
     &      2.*KappaRU(i,j,kDownC)*rdrckp1*viscFac
     &     + bottomDragLinear*dragFac
     &    )*(1.-maskDown)*uFld(i,j)
        IF ( (KE(i,j)+KE(i-1,j)) .NE. 0. ) THEN
         uDragTerms(i,j)=uDragTerms(i,j)
     &    -recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
     &    *bottomDragQuadratic*SQRT(KE(i,j)+KE(i-1,j))*dragFac
     &    *(1.-maskDown)*uFld(i,j)
        ENDIF
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_U_RVISCFLUX(
     I        bi,bj,k,
     I        uFld, KappaRU,
     O        rViscFluxU,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 KappaRU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      INTEGER myThid
      Real*8 rViscFluxU(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      IF ( k.LE.1 .OR. k.GT.Nr ) THEN
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
          rViscFluxU(i,j) = 0.d0
        ENDDO
       ENDDO
      ELSE
       DO j=1-Oly,sNy+Oly-1
        DO i=1-Olx,sNx+Olx-1
          rViscFluxU(i,j) =
     &      -KappaRU(i,j,k)
     &      *rAw(i,j,bi,bj)*deepFac2F(k)*rhoFacF(k)
     &      *( uFld(i,j,k,bi,bj)-uFld(i,j,k-1,bi,bj)
     &       )*rkSign*recip_drC(k)
     &      *maskW(i,j,k,bi,bj)
     &      *maskW(i,j,k-1,bi,bj)
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_U_SIDEDRAG(
     I        bi,bj,k,
     I        uFld, del2u, hFacZ,
     I        viscAh_Z,viscA4_Z,
     I        harmonic,biharmonic,useVariableViscosity,
     O        uDragTerms,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 del2u(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      LOGICAL harmonic,biharmonic,useVariableViscosity
      INTEGER myThid
      Real*8 uDragTerms(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      Real*8 hFacZClosedS,hFacZClosedN
      Real*8 Ahtmp,A4tmp
      IF ( sideDragFactor.LE.0. ) THEN
      DO j=2-Oly,sNy+Oly-1
       DO i=2-Olx,sNx+Olx-1
        hFacZClosedS = hFacW(i,j,k,bi,bj) - hFacZ(i,j)
        hFacZClosedN = hFacW(i,j,k,bi,bj) - hFacZ(i,j+1)
        Ahtmp=min(viscAh+viscAhGrid*rAw(i,j,bi,bj)/deltaTmom,
     &            viscAhMax)
        A4tmp=min(viscA4+viscA4Grid*(rAw(i,j,bi,bj)**2)/deltaTmom,
     &            viscA4Max)
        A4tmp=min(A4tmp,viscA4GridMax*(rAw(i,j,bi,bj)**2)/deltaTmom)
        A4tmp=max(A4tmp,viscA4GridMin*(rAw(i,j,bi,bj)**2)/deltaTmom)
        uDragTerms(i,j) =
     &   -recip_hFacW(i,j,k,bi,bj)
     &   *recip_drF(k)*recip_rAw(i,j,bi,bj)
     &   *( hFacZClosedS*dxV(i, j ,bi,bj)
     &      *recip_dyU(i, j ,bi,bj)
     &     +hFacZClosedN*dxV(i,j+1,bi,bj)
     &      *recip_dyU(i,j+1,bi,bj) )
     &   *drF(k)*2.*(
     &                Ahtmp*uFld(i,j)
     &               -A4tmp*del2u(i,j)
     &              )
       ENDDO
      ENDDO
      ELSE
      DO j=2-Oly,sNy+Oly-1
       DO i=2-Olx,sNx+Olx-1
        hFacZClosedS = hFacW(i,j,k,bi,bj) - hFacW(i,j-1,k,bi,bj)
        hFacZClosedN = hFacW(i,j,k,bi,bj) - hFacW(i,j+1,k,bi,bj)
        hFacZClosedS = MAX( 0.d0, hFacZClosedS )
        hFacZClosedN = MAX( 0.d0, hFacZClosedN )
        uDragTerms(i,j) =
     &   -recip_hFacW(i,j,k,bi,bj)
     &   *recip_drF(k)*recip_rAw(i,j,bi,bj)
     &   *( hFacZClosedS*dxV(i, j ,bi,bj)*recip_dyU(i, j ,bi,bj)
     &         *( viscAh_Z(i,j  )*uFld(i,j)
     &           -viscA4_Z(i,j  )*del2u(i,j) )
     &     +hFacZClosedN*dxV(i,j+1,bi,bj)*recip_dyU(i,j+1,bi,bj)
     &         *( viscAh_Z(i,j+1)*uFld(i,j)
     &           -viscA4_Z(i,j+1)*del2u(i,j) )
     &    )*drF(k)*sideDragFactor
       ENDDO
      ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_V_CORIOLIS_NH(
     I               bi,bj,k,wFld,
     O               vCoriolisTerm,
     I               myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 wFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      Real*8 vCoriolisTerm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j,kp1
      Real*8 wMsk
      kp1=min(k+1,Nr)
      wMsk=1.
      IF (k.EQ.Nr) wMsk=0.
      DO j=2-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
        vCoriolisTerm(i,j) =
     &   -0.5*( fCoriCos( i ,j,bi,bj)*angleSinC(i, j ,bi,bj)
     &         *0.5*( wFld( i ,j, k ,bi,bj)*rVel2wUnit( k )
     &               +wFld( i ,j,kp1,bi,bj)*rVel2wUnit(kp1)*wMsk )
     &        + fCoriCos(i,j-1,bi,bj)*angleSinC(i,j-1,bi,bj)
     &         *0.5*( wFld(i,j-1, k ,bi,bj)*rVel2wUnit( k )
     &               +wFld(i,j-1,kp1,bi,bj)*rVel2wUnit(kp1)*wMsk )
     &        )*gravitySign
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_V_METRIC_NH(
     I               bi,bj,k,
     I               vFld,wFld,
     O               vMetricTerms,
     I               myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 wFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      Real*8 vMetricTerms(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j,kp1
      Real*8 wVelBottomOverride
      kp1=min(k+1,Nr)
      wVelBottomOverride=1.
      IF (k.EQ.Nr) wVelBottomOverride=0.
      DO j=1-Olx+1,sNy+Oly
       DO i=1-Olx,sNx+Olx
         vMetricTerms(i,j) = vFld(i,j)*recip_rSphere*recip_deepFacC(k)
     &    *0.25*( (wFld(i,j-1,kp1,bi,bj)+wFld(i,j,kp1,bi,bj))
     &            *rVel2wUnit(kp1)*wVelBottomOverride
     &          + (wFld(i,j-1, k ,bi,bj)+wFld(i,j, k ,bi,bj))
     &            *rVel2wUnit( k )
     &          )*gravitySign
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_V_BOTTOMDRAG(
     I        bi,bj,k,
     I        vFld, KE, KappaRV,
     O        vDragTerms,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 KE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 KappaRV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      INTEGER myThid
      Real*8 vDragTerms(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j,kDown,kDownC,kBottom
      Real*8 viscFac, dragFac
      Real*8 rdrckp1, maskDown
      IF ( usingZCoords ) THEN
       kBottom = Nr
       kDown   = min(k+1,kBottom)
       kDownC  = kDown
       dragFac = 1.d0
      ELSE
       kBottom = 1
       kDown   = max(k-1,kBottom)
       kDownC  = k
       dragFac = mass2rUnit*rhoConst
      ENDIF
      rdrckp1=recip_drC(kDownC)
      viscFac=0.
      IF (no_slip_bottom) viscFac=1.
      IF (k.EQ.kBottom) rdrckp1=recip_drF(k)
      DO j=1-Oly+1,sNy+Oly-1
       DO i=1-Olx,sNx+Olx-1
        maskDown=maskS(i,j,kdown,bi,bj)
        IF (k.EQ.kBottom) maskDown=0.
        vDragTerms(i,j)=
     &   -recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
     &   *(
     &      2.*KappaRV(i,j,kDownC)*rdrckp1*viscFac
     &     + bottomDragLinear*dragFac
     &    )*(1.-maskDown)*vFld(i,j)
        IF ( (KE(i,j)+KE(i,j-1)) .NE. 0. ) THEN
         vDragTerms(i,j)=vDragTerms(i,j)
     &    -recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
     &    *bottomDragQuadratic*SQRT(KE(i,j)+KE(i,j-1))*dragFac
     &    *(1.-maskDown)*vFld(i,j)
        ENDIF
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_V_RVISCFLUX(
     I        bi,bj,k,
     I        vFld, KappaRV,
     O        rViscFluxV,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 KappaRV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      INTEGER myThid
      Real*8 rViscFluxV(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      IF ( k.LE.1 .OR. k.GT.Nr ) THEN
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
          rViscFluxV(i,j) = 0.d0
        ENDDO
       ENDDO
      ELSE
       DO j=1-Oly,sNy+Oly-1
        DO i=1-Olx,sNx+Olx-1
          rViscFluxV(i,j) =
     &     -KappaRV(i,j,k)
     &     *rAs(i,j,bi,bj)*deepFac2F(k)*rhoFacF(k)
     &     *( vFld(i,j,k,bi,bj)-vFld(i,j,k-1,bi,bj)
     &      )*rkSign*recip_drC(k)
     &     *maskS(i,j,k,bi,bj)
     &     *maskS(i,j,k-1,bi,bj)
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_V_SIDEDRAG(
     I        bi,bj,k,
     I        vFld, del2v, hFacZ,
     I        viscAh_Z,viscA4_Z,
     I        harmonic,biharmonic,useVariableViscosity,
     O        vDragTerms,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 del2v(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      LOGICAL harmonic,biharmonic,useVariableViscosity
      INTEGER myThid
      Real*8 vDragTerms(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      Real*8 hFacZClosedE,hFacZClosedW
      Real*8 Ahtmp,A4tmp
      IF ( sideDragFactor.LE.0. ) THEN
      DO j=2-Oly,sNy+Oly-1
       DO i=2-Olx,sNx+Olx-1
        hFacZClosedW = hFacS(i,j,k,bi,bj) - hFacZ(i,j)
        hFacZClosedE = hFacS(i,j,k,bi,bj) - hFacZ(i+1,j)
        Ahtmp=min(viscAh+viscAhGrid*rAs(i,j,bi,bj)/deltaTmom,
     &            viscAhMax)
        A4tmp=min(viscA4+viscA4Grid*(rAs(i,j,bi,bj)**2)/deltaTmom,
     &            viscA4Max)
        IF (viscA4GridMax.GT.0.) THEN
           A4tmp=min(A4tmp,viscA4GridMax*(rAs(i,j,bi,bj)**2)/deltaTmom)
        ENDIF
        A4tmp=max(A4tmp,viscA4GridMin*(rAs(i,j,bi,bj)**2)/deltaTmom)
        vDragTerms(i,j) =
     &   -recip_hFacS(i,j,k,bi,bj)
     &   *recip_drF(k)*recip_rAs(i,j,bi,bj)
     &   *( hFacZClosedW*dyU( i ,j,bi,bj)
     &      *recip_dxV( i ,j,bi,bj)
     &     +hFacZClosedE*dyU(i+1,j,bi,bj)
     &      *recip_dxV(i+1,j,bi,bj) )
     &   *drF(k)*2.*(
     &                Ahtmp*vFld(i,j)*cosFacV(j,bi,bj)
     &               -A4tmp*del2v(i,j)*cosFacV(j,bi,bj)
     &              )
       ENDDO
      ENDDO
      ELSE
      DO j=2-Oly,sNy+Oly-1
       DO i=2-Olx,sNx+Olx-1
        hFacZClosedW = hFacS(i,j,k,bi,bj) - hFacS(i-1,j,k,bi,bj)
        hFacZClosedE = hFacS(i,j,k,bi,bj) - hFacS(i+1,j,k,bi,bj)
        hFacZClosedW = MAX( 0.d0, hFacZClosedW )
        hFacZClosedE = MAX( 0.d0, hFacZClosedE )
        vDragTerms(i,j) =
     &   -recip_hFacS(i,j,k,bi,bj)
     &   *recip_drF(k)*recip_rAs(i,j,bi,bj)
     &   *( hFacZClosedW*dyU( i ,j,bi,bj)*recip_dxV( i ,j,bi,bj)
     &         *( viscAh_Z(i  ,j)*vFld(i,j)*cosFacV(j,bi,bj)
     &           -viscA4_Z(i  ,j)*del2v(i,j)*cosFacV(j,bi,bj) )
     &     +hFacZClosedE*dyU(i+1,j,bi,bj)*recip_dxV(i+1,j,bi,bj)
     &         *( viscAh_Z(i+1,j)*vFld(i,j)*cosFacV(j,bi,bj)
     &           -viscA4_Z(i+1,j)*del2v(i,j)*cosFacV(j,bi,bj) )
     &    )*drF(k)*sideDragFactor
       ENDDO
      ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_CALC_RTRANS(
     I                          k, bi, bj,
     O                          rTransU, rTransV,
     I                          myTime, myIter, myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER k, bi, bj, myIter, myThid
      Real*8 myTime
      Real*8 rTransU(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rTransV(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
       IF ( k.GT.Nr ) THEN
        DO j=1-OLy+1,sNy+OLy
         DO i=1-OLx+1,sNx+OLx
          rTransU(i,j) = 0.
          rTransV(i,j) = 0.
         ENDDO
        ENDDO
      ELSE
        DO j=1-OLy+1,sNy+OLy
         DO i=1-OLx+1,sNx+OLx
          rTransU(i,j) =
     &         0.5d0*( wVel(i-1,j,k,bi,bj)*rA(i-1,j,bi,bj)
     &                   +wVel( i ,j,k,bi,bj)*rA( i ,j,bi,bj)
     &                  )*deepFac2F(k)*rhoFacF(k)
          rTransV(i,j) =
     &         0.5d0*( wVel(i,j-1,k,bi,bj)*rA(i,j-1,bi,bj)
     &                   +wVel(i, j ,k,bi,bj)*rA(i, j ,bi,bj)
     &                  )*deepFac2F(k)*rhoFacF(k)
         ENDDO
        ENDDO
      ENDIF
      RETURN
      END
CBOI
C
CEOI
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_FLUXFORM(
     I        bi,bj,iMin,iMax,jMin,jMax,k,kUp,kDown,
     I        KappaRU, KappaRV,
     U        fVerU, fVerV,
     O        guDiss, gvDiss,
     I        myTime, myIter, myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      INTEGER bi,bj,iMin,iMax,jMin,jMax
      INTEGER k,kUp,kDown
      Real*8 KappaRU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 KappaRV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 fVerU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
      Real*8 fVerV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
      Real*8 guDiss(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 gvDiss(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8     myTime
      INTEGER myIter
      INTEGER myThid
      INTEGER i,j
      INTEGER imomkey
      Real*8 vF(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 v4F(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 cF(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 mT(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 fZon(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 fMer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 fVrUp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 fVrDw(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8    hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8  r_hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8      xA(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8      yA(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8  uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8  vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8  uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8  vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8  rTransU(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8  rTransV(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 KE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vort3(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hDiv(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 strain(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tension(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8  uDudxFac
      Real*8  AhDudxFac
      Real*8  vDudyFac
      Real*8  AhDudyFac
      Real*8  rVelDudrFac
      Real*8  ArDudrFac
      Real*8  fuFac
      Real*8  mtFacU
      Real*8  mtNHFacU
      Real*8  uDvdxFac
      Real*8  AhDvdxFac
      Real*8  vDvdyFac
      Real*8  AhDvdyFac
      Real*8  rVelDvdrFac
      Real*8  ArDvdrFac
      Real*8  fvFac
      Real*8  mtFacV
      Real*8  mtNHFacV
      Real*8  sideMaskFac
      LOGICAL bottomDragTerms,harmonic,biharmonic,useVariableViscosity
          act0 = k - 1
          max0 = Nr
          act1 = bi - myBxLo(myThid)
          max1 = myBxHi(myThid) - myBxLo(myThid) + 1
          act2 = bj - myByLo(myThid)
          max2 = myByHi(myThid) - myByLo(myThid) + 1
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = ikey_dynamics - 1
          imomkey = (act0 + 1)
     &                    + act1*max0
     &                    + act2*max0*max1
     &                    + act3*max0*max1*max2
     &                    + act4*max0*max1*max2*max3
      DO j=1-OLy,sNy+OLy
       DO i=1-OLx,sNx+OLx
        vF(i,j)   = 0.
        v4F(i,j)  = 0.
        cF(i,j)   = 0.
        mT(i,j)   = 0.
        fZon(i,j) = 0.
        fMer(i,j) = 0.
        fVrUp(i,j)= 0.
        fVrDw(i,j)= 0.
        rTransU(i,j)= 0.
        rTransV(i,j)= 0.
        hDiv(i,j)   = 0.
        vort3(i,j)  = 0.
        strain(i,j) = 0.
        tension(i,j)= 0.
        guDiss(i,j) = 0.
        gvDiss(i,j) = 0.
       ENDDO
      ENDDO
      uDudxFac     = afFacMom*1.
      AhDudxFac    = vfFacMom*1.
      vDudyFac     = afFacMom*1.
      AhDudyFac    = vfFacMom*1.
      rVelDudrFac  = afFacMom*1.
      ArDudrFac    = vfFacMom*1.
      mtFacU       = mtFacMom*1.
      mtNHFacU     = 1.
      fuFac        = cfFacMom*1.
      uDvdxFac     = afFacMom*1.
      AhDvdxFac    = vfFacMom*1.
      vDvdyFac     = afFacMom*1.
      AhDvdyFac    = vfFacMom*1.
      rVelDvdrFac  = afFacMom*1.
      ArDvdrFac    = vfFacMom*1.
      mtFacV       = mtFacMom*1.
      mtNHFacV     = 1.
      fvFac        = cfFacMom*1.
      IF (implicitViscosity) THEN
        ArDudrFac  = 0.
        ArDvdrFac  = 0.
      ENDIF
      IF ( no_slip_sides ) THEN
        sideMaskFac = sideDragFactor
      ELSE
        sideMaskFac = 0.d0
      ENDIF
      IF (     no_slip_bottom
     &    .OR. bottomDragQuadratic.NE.0.
     &    .OR. bottomDragLinear.NE.0.) THEN
       bottomDragTerms=.TRUE.
      ELSE
       bottomDragTerms=.FALSE.
      ENDIF
      CALL MOM_CALC_HFACZ(bi,bj,k,hFacZ,r_hFacZ,myThid)
      DO j=1-OLy,sNy+OLy
       DO i=1-OLx,sNx+OLx
        xA(i,j) = dyG(i,j,bi,bj)*deepFacC(k)
     &          *drF(k)*hFacW(i,j,k,bi,bj)
        yA(i,j) = dxG(i,j,bi,bj)*deepFacC(k)
     &          *drF(k)*hFacS(i,j,k,bi,bj)
       ENDDO
      ENDDO
      DO j=1-OLy,sNy+OLy
       DO i=1-OLx,sNx+OLx
        uFld(i,j) = uVel(i,j,k,bi,bj)
        vFld(i,j) = vVel(i,j,k,bi,bj)
       ENDDO
      ENDDO
      DO j=1-OLy,sNy+OLy
       DO i=1-OLx,sNx+OLx
        uTrans(i,j) = uFld(i,j)*xA(i,j)*rhoFacC(k)
        vTrans(i,j) = vFld(i,j)*yA(i,j)*rhoFacC(k)
       ENDDO
      ENDDO
      CALL MOM_CALC_KE(bi,bj,k,2,uFld,vFld,KE,myThid)
      IF ( momViscosity) THEN
        CALL MOM_CALC_HDIV(bi,bj,k,2,uFld,vFld,hDiv,myThid)
        CALL MOM_CALC_RELVORT3(bi,bj,k,uFld,vFld,hFacZ,vort3,myThid)
        CALL MOM_CALC_TENSION(bi,bj,k,uFld,vFld,tension,myThid)
        CALL MOM_CALC_STRAIN(bi,bj,k,uFld,vFld,hFacZ,strain,myThid)
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
           IF ( hFacZ(i,j).EQ.0. ) THEN
             vort3(i,j)  = sideMaskFac*vort3(i,j)
             strain(i,j) = sideMaskFac*strain(i,j)
           ENDIF
         ENDDO
        ENDDO
      ENDIF
      IF (momAdvection.AND.k.EQ.1) THEN
        CALL MOM_CALC_RTRANS( k, bi, bj,
     O                        rTransU, rTransV,
     I                        myTime, myIter, myThid)
        CALL MOM_U_ADV_WU( bi,bj,k,uVel,wVel,rTransU,
     O                     fVerU(1-OLx,1-OLy,kUp), myThid )
        CALL MOM_V_ADV_WV( bi,bj,k,vVel,wVel,rTransV,
     O                     fVerV(1-OLx,1-OLy,kUp), myThid )
      ENDIF
      IF (momAdvection) THEN
        CALL MOM_CALC_RTRANS( k+1, bi, bj,
     O                        rTransU, rTransV,
     I                        myTime, myIter, myThid)
      ENDIF
      IF (momViscosity) THEN
       CALL MOM_CALC_VISC(
     I        bi,bj,k,
     O        viscAh_Z,viscAh_D,viscA4_Z,viscA4_D,
     O        harmonic,biharmonic,useVariableViscosity,
     I        hDiv,vort3,tension,strain,KE,hFacZ,
     I        myThid)
      ENDIF
      IF (momAdvection) THEN
        CALL MOM_U_ADV_UU(bi,bj,k,uTrans,uFld,fZon,myThid)
        CALL MOM_U_ADV_VU(bi,bj,k,vTrans,uFld,fMer,myThid)
        CALL MOM_U_ADV_WU(
     I                     bi,bj,k+1,uVel,wVel,rTransU,
     O                     fVerU(1-OLx,1-OLy,kDown), myThid )
        DO j=jMin,jMax
         DO i=iMin,iMax
          gU(i,j,k,bi,bj) =
     &     -recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
     &     *recip_rAw(i,j,bi,bj)*recip_deepFac2C(k)*recip_rhoFacC(k)
     &     *( ( fZon(i,j  )     - fZon(i-1,j) )*uDudxFac
     &       +( fMer(i,j+1)     - fMer(i,  j) )*vDudyFac
     &       +(fVerU(i,j,kDown) - fVerU(i,j,kUp))*rkSign*rVelDudrFac
     &     )
         ENDDO
        ENDDO
      ELSE
        DO j=1-OLy,sNy+OLy
         DO i=1-OLx,sNx+OLx
           gU(i,j,k,bi,bj) = 0.d0
         ENDDO
        ENDDO
      ENDIF
      IF (momViscosity) THEN
        IF (biharmonic)
     &  CALL MOM_U_DEL2U(bi,bj,k,uFld,hFacZ,v4f,myThid)
        CALL MOM_U_XVISCFLUX(bi,bj,k,uFld,v4F,fZon,
     I    viscAh_D,viscA4_D,myThid)
        CALL MOM_U_YVISCFLUX(bi,bj,k,uFld,v4F,hFacZ,fMer,
     I    viscAh_Z,viscA4_Z,myThid)
       IF (.NOT.implicitViscosity) THEN
        CALL MOM_U_RVISCFLUX(bi,bj, k, uVel,KappaRU,fVrUp,myThid)
        CALL MOM_U_RVISCFLUX(bi,bj,k+1,uVel,KappaRU,fVrDw,myThid)
       ENDIF
        DO j=jMin,jMax
         DO i=iMin,iMax
          guDiss(i,j) =
     &     -recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
     &     *recip_rAw(i,j,bi,bj)*recip_deepFac2C(k)
     &     *( ( fZon(i,j  ) - fZon(i-1,j) )*AhDudxFac
     &       +( fMer(i,j+1) - fMer(i,  j) )*AhDudyFac
     &       +( fVrDw(i,j)  - fVrUp(i,j)  )*rkSign*ArDudrFac
     &                                     *recip_rhoFacC(k)
     &     )
         ENDDO
        ENDDO
        IF (no_slip_sides) THEN
         CALL MOM_U_SIDEDRAG(
     I        bi,bj,k,
     I        uFld, v4f, hFacZ,
     I        viscAh_Z,viscA4_Z,
     I        harmonic,biharmonic,useVariableViscosity,
     O        vF,
     I        myThid)
         DO j=jMin,jMax
          DO i=iMin,iMax
           gUdiss(i,j) = gUdiss(i,j) + vF(i,j)
          ENDDO
         ENDDO
        ENDIF
        IF (bottomDragTerms) THEN
         CALL MOM_U_BOTTOMDRAG(bi,bj,k,uFld,KE,KappaRU,vF,myThid)
         DO j=jMin,jMax
          DO i=iMin,iMax
           gUdiss(i,j) = gUdiss(i,j) + vF(i,j)
          ENDDO
         ENDDO
        ENDIF
      ENDIF
      IF (useNHMTerms) THEN
       CALL MOM_U_METRIC_NH(bi,bj,k,uFld,wVel,mT,myThid)
       DO j=jMin,jMax
        DO i=iMin,iMax
         gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+mtNHFacU*mT(i,j)
        ENDDO
       ENDDO
      ENDIF
      IF ( usingSphericalPolarGrid .AND. metricTerms ) THEN
       CALL MOM_U_METRIC_SPHERE(bi,bj,k,uFld,vFld,mT,myThid)
       DO j=jMin,jMax
        DO i=iMin,iMax
         gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+mtFacU*mT(i,j)
        ENDDO
       ENDDO
      ENDIF
      IF ( usingCylindricalGrid .AND. metricTerms ) THEN
       CALL MOM_U_METRIC_CYLINDER(bi,bj,k,uFld,vFld,mT,myThid)
       DO j=jMin,jMax
        DO i=iMin,iMax
         gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+mtFacU*mT(i,j)
        ENDDO
       ENDDO
      ENDIF
      IF (momAdvection) THEN
        CALL MOM_V_ADV_UV(bi,bj,k,uTrans,vFld,fZon,myThid)
        CALL MOM_V_ADV_VV(bi,bj,k,vTrans,vFld,fMer,myThid)
        CALL MOM_V_ADV_WV(
     I                     bi,bj,k+1,vVel,wVel,rTransV,
     O                     fVerV(1-OLx,1-OLy,kDown), myThid )
        DO j=jMin,jMax
         DO i=iMin,iMax
          gV(i,j,k,bi,bj) =
     &     -recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
     &     *recip_rAs(i,j,bi,bj)*recip_deepFac2C(k)*recip_rhoFacC(k)
     &     *( ( fZon(i+1,j)     - fZon(i,j  ) )*uDvdxFac
     &       +( fMer(i,  j)     - fMer(i,j-1) )*vDvdyFac
     &       +(fVerV(i,j,kDown) - fVerV(i,j,kUp))*rkSign*rVelDvdrFac
     &     )
         ENDDO
        ENDDO
      ELSE
        DO j=1-OLy,sNy+OLy
         DO i=1-OLx,sNx+OLx
           gV(i,j,k,bi,bj) = 0.d0
         ENDDO
        ENDDO
      ENDIF
      IF (momViscosity) THEN
        IF (biharmonic)
     &  CALL MOM_V_DEL2V(bi,bj,k,vFld,hFacZ,v4f,myThid)
        CALL MOM_V_XVISCFLUX(bi,bj,k,vFld,v4f,hFacZ,fZon,
     I    viscAh_Z,viscA4_Z,myThid)
        CALL MOM_V_YVISCFLUX(bi,bj,k,vFld,v4f,fMer,
     I    viscAh_D,viscA4_D,myThid)
       IF (.NOT.implicitViscosity) THEN
        CALL MOM_V_RVISCFLUX(bi,bj, k, vVel,KappaRV,fVrUp,myThid)
        CALL MOM_V_RVISCFLUX(bi,bj,k+1,vVel,KappaRV,fVrDw,myThid)
       ENDIF
        DO j=jMin,jMax
         DO i=iMin,iMax
          gvDiss(i,j) =
     &     -recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
     &      *recip_rAs(i,j,bi,bj)*recip_deepFac2C(k)
     &     *( ( fZon(i+1,j)  - fZon(i,j  ) )*AhDvdxFac
     &       +( fMer(i,  j)  - fMer(i,j-1) )*AhDvdyFac
     &       +( fVrDw(i,j)   - fVrUp(i,j) )*rkSign*ArDvdrFac
     &                                     *recip_rhoFacC(k)
     &     )
         ENDDO
        ENDDO
        IF (no_slip_sides) THEN
         CALL MOM_V_SIDEDRAG(
     I        bi,bj,k,
     I        vFld, v4f, hFacZ,
     I        viscAh_Z,viscA4_Z,
     I        harmonic,biharmonic,useVariableViscosity,
     O        vF,
     I        myThid)
         DO j=jMin,jMax
          DO i=iMin,iMax
           gvDiss(i,j) = gvDiss(i,j) + vF(i,j)
          ENDDO
         ENDDO
        ENDIF
        IF (bottomDragTerms) THEN
         CALL MOM_V_BOTTOMDRAG(bi,bj,k,vFld,KE,KappaRV,vF,myThid)
         DO j=jMin,jMax
          DO i=iMin,iMax
           gvDiss(i,j) = gvDiss(i,j) + vF(i,j)
          ENDDO
         ENDDO
        ENDIF
      ENDIF
      IF (useNHMTerms) THEN
       CALL MOM_V_METRIC_NH(bi,bj,k,vFld,wVel,mT,myThid)
       DO j=jMin,jMax
        DO i=iMin,iMax
         gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+mtNHFacV*mT(i,j)
        ENDDO
       ENDDO
      ENDIF
      IF ( usingSphericalPolarGrid .AND. metricTerms ) THEN
       CALL MOM_V_METRIC_SPHERE(bi,bj,k,uFld,mT,myThid)
       DO j=jMin,jMax
        DO i=iMin,iMax
         gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+mtFacV*mT(i,j)
        ENDDO
       ENDDO
      ENDIF
      IF ( usingCylindricalGrid .AND. metricTerms ) THEN
       CALL MOM_V_METRIC_CYLINDER(bi,bj,k,uFld,vFld,mT,myThid)
       DO j=jMin,jMax
        DO i=iMin,iMax
         gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+mtFacV*mT(i,j)
        ENDDO
       ENDDO
      ENDIF
      IF (.NOT.useCDscheme) THEN
        CALL MOM_U_CORIOLIS(bi,bj,k,vFld,cf,myThid)
        DO j=jMin,jMax
         DO i=iMin,iMax
          gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+fuFac*cf(i,j)
         ENDDO
        ENDDO
        CALL MOM_V_CORIOLIS(bi,bj,k,uFld,cf,myThid)
        DO j=jMin,jMax
         DO i=iMin,iMax
          gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+fvFac*cf(i,j)
         ENDDO
        ENDDO
      ENDIF
      IF ( use3dCoriolis ) THEN
        CALL MOM_U_CORIOLIS_NH(bi,bj,k,wVel,cf,myThid)
        DO j=jMin,jMax
         DO i=iMin,iMax
          gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+fuFac*cf(i,j)
         ENDDO
        ENDDO
       IF ( usingCurvilinearGrid ) THEN
        CALL MOM_V_CORIOLIS_NH(bi,bj,k,wVel,cf,myThid)
        DO j=jMin,jMax
         DO i=iMin,iMax
          gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+fvFac*cf(i,j)
         ENDDO
        ENDDO
       ENDIF
      ENDIF
      DO j=jMin,jMax
       DO i=iMin,iMax
        gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)*maskW(i,j,k,bi,bj)
        guDiss(i,j)     = guDiss(i,j)    *maskW(i,j,k,bi,bj)
        gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)*maskS(i,j,k,bi,bj)
        gvDiss(i,j)     = gvDiss(i,j)    *maskS(i,j,k,bi,bj)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_U_ADV_UU(
     I        bi,bj,k,
     I        uTrans, uFld,
     O        AdvectFluxUU,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 AdvectFluxUU(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      DO j=1-Oly,sNy+Oly-1
       DO i=1-Olx,sNx+Olx-1
        AdvectFluxUU(i,j) =
     &  0.25*( uTrans(i,j) + uTrans(i+1,j) )
     &      *(   uFld(i,j) +   uFld(i+1,j) )
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_U_ADV_VU(
     I        bi,bj,k,
     I        vTrans, uFld,
     O        AdvectFluxVU,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 AdvectFluxVU(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      DO j=1-Oly+1,sNy+Oly
       DO i=1-Olx+1,sNx+Olx
        AdvectFluxVU(i,j) =
     &  0.25*( vTrans(i,j) + vTrans(i-1,j) )
     &      *( uFld(i,j) + uFld(i,j-1) )
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_U_ADV_WU(
     I        bi,bj,k,
     I        uFld,wFld,rTrans,
     O        advectiveFluxWU,
     I        myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 wFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 advectiveFluxWU(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      IF ( k.EQ.Nr+1 .AND.
     &     useRealFreshWaterFlux .AND. usingPCoords ) THEN
       DO j=1-Oly+1,sNy+Oly
        DO i=1-Olx+1,sNx+Olx
         advectiveFluxWU(i,j) = rTrans(i,j)*uFld(i,j,k-1,bi,bj)
        ENDDO
       ENDDO
      ELSEIF ( k.GT.Nr .OR. (k.EQ.1.AND.rigidLid) ) THEN
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
        advectiveFluxWU(i,j) = 0.
       ENDDO
      ENDDO
      ELSEIF (k.EQ.1) THEN
      DO j=1-Oly+1,sNy+Oly
       DO i=1-Olx+1,sNx+Olx
        advectiveFluxWU(i,j) = rTrans(i,j)*uFld(i,j,k,bi,bj)
       ENDDO
      ENDDO
      ELSE
      DO j=1-Oly+1,sNy+Oly
       DO i=1-Olx+1,sNx+Olx
        advectiveFluxWU(i,j) = rTrans(i,j)*
     &   0.5d0*( uFld(i,j,k,bi,bj)+uFld(i,j,k-1,bi,bj) )
       ENDDO
      ENDDO
      IF ( select_rStar.EQ.0 .AND. .NOT.rigidLid ) THEN
        DO j=1-Oly+1,sNy+Oly
         DO i=1-Olx+1,sNx+Olx
          advectiveFluxWU(i,j) = advectiveFluxWU(i,j)
     &     +0.25*(
     &          wFld(i, j ,k,bi,bj)*rA(i, j ,bi,bj)*
     &          (maskC( i ,j,k,bi,bj)-maskC( i ,j,k-1,bi,bj))
     &         +wFld(i-1,j,k,bi,bj)*rA(i-1,j,bi,bj)*
     &          (maskC(i-1,j,k,bi,bj)-maskC(i-1,j,k-1,bi,bj))
     &           )*deepFac2F(k)*rhoFacF(k)
     &            *uFld(i,j,k,bi,bj)
         ENDDO
        ENDDO
      ENDIF
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_U_CORIOLIS(
     I        bi,bj,k,vFld,
     U        uCoriolisTerm,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 uCoriolisTerm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      Real*8 one
      PARAMETER( one = 1.d0 )
      IF (useEnergyConservingCoriolis) THEN
       DO j=1-Oly,sNy+Oly-1
        DO i=1-Olx+1,sNx+Olx
         uCoriolisTerm(i,j) =
     &     0.5*( fCori( i ,j,bi,bj)
     &          *0.5*( vFld( i ,j)+vFld( i ,j+1) )
     &         + fCori(i-1,j,bi,bj)
     &          *0.5*( vFld(i-1,j)+vFld(i-1,j+1) ) )
        ENDDO
       ENDDO
      ELSE
       DO j=1-Oly,sNy+Oly-1
        DO i=1-Olx+1,sNx+Olx
         uCoriolisTerm(i,j) =
     &     0.5*( fCori( i ,j,bi,bj) +
     &           fCori(i-1,j,bi,bj)  )
     &   *0.25*(
     &     vFld( i ,j)+vFld( i ,j+1)
     &    +vFld(i-1,j)+vFld(i-1,j+1)
     &         )
        ENDDO
       ENDDO
      ENDIF
      IF (useJamartWetPoints) THEN
       DO j=1-Oly,sNy+Oly-1
        DO i=1-Olx+1,sNx+Olx
         uCoriolisTerm(i,j) = uCoriolisTerm(i,j)
     &   *4.d0/MAX( one,
     &                 maskS( i , j ,k,bi,bj)+maskS( i ,j+1,k,bi,bj)
     &                +maskS(i-1, j ,k,bi,bj)+maskS(i-1,j+1,k,bi,bj) )
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_U_DEL2U(
     I        bi,bj,k,
     I        uFld, hFacZ,
     O        del2u,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 del2u(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER I,J
      Real*8 fZon(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 fMer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hFacZClosedS,hFacZClosedN
      DO j=1-Oly+1,sNy+Oly-1
       DO i=1-Olx,sNx+Olx-1
        fZon(i,j) = drF(k)*hFacC(i,j,k,bi,bj)
     &   *dyF(i,j,bi,bj)
     &   *recip_dxF(i,j,bi,bj)
     &   *(uFld(i+1,j)-uFld(i,j))
       ENDDO
      ENDDO
      DO j=1-Oly+1,sNy+Oly
       DO i=1-Olx+1,sNx+Olx-1
        fMer(i,j) = drF(k)*hFacZ(i,j)
     &   *dxV(i,j,bi,bj)
     &   *recip_dyU(i,j,bi,bj)
     &   *(uFld(i,j)-uFld(i,j-1))
       ENDDO
      ENDDO
      DO j=1-Oly+1,sNy+Oly-1
       DO i=1-Olx+1,sNx+Olx-1
        del2u(i,j) =
     &   recip_drF(k)*recip_hFacW(i,j,k,bi,bj)
     &  *recip_rAw(i,j,bi,bj)*recip_deepFac2C(k)
     &  *( fZon(i,j  )    - fZon(i-1,j)
     &    +fMer(i,j+1)    - fMer(i  ,j)
     &   )*maskW(i,j,k,bi,bj)
       ENDDO
      ENDDO
      IF (no_slip_sides) THEN
      DO j=1-Oly+1,sNy+Oly-1
       DO i=1-Olx+1,sNx+Olx-1
        hFacZClosedS = hFacW(i,j,k,bi,bj) - hFacZ(i,j)
        hFacZClosedN = hFacW(i,j,k,bi,bj) - hFacZ(i,j+1)
        del2u(i,j) = del2u(i,j)
     &  -recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
     &   *recip_rAw(i,j,bi,bj)*recip_deepFac2C(k)
     &   *( hFacZClosedS*dxV(i, j ,bi,bj)
     &     *recip_dyU(i, j ,bi,bj)
     &     +hFacZClosedN*dxV(i,j+1,bi,bj)
     &     *recip_dyU(i,j+1,bi,bj)
     &    )*drF(k)*2.*uFld(i,j)
     &     *maskW(i,j,k,bi,bj)
       ENDDO
      ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_U_METRIC_CYLINDER(
     I        bi,bj,k,
     I        uFld, vFld,
     O        uMetricTerms,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 uMetricTerms(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      Real*8 radius
      DO j=1-Oly,sNy+Oly-1
       DO i=1-Olx+1,sNx+Olx
          radius = (yG(i,j,bi,bj)+yG(i,j+1,bi,bj))*0.5d0
          IF ( radius.GT.0. ) THEN
             uMetricTerms(i,j) = 
     &            uFld(i,j)
     &            *0.25*(vFld(i,j) + vFld(i-1,j) +
     &                   vFld(i,j+1)+vFld(i-1,j+1))/radius
          ELSE
             uMetricTerms(i,j) = 0.
          ENDIF
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_U_METRIC_SPHERE(
     I        bi,bj,k,
     I        uFld, vFld,
     O        uMetricTerms,
     I        myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 uMetricTerms(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      DO j=1-Olx,sNy+Oly-1
       DO i=1-Olx+1,sNx+Olx
         uMetricTerms(i,j) =
     &    uFld(i,j)*recip_rSphere*recip_deepFacC(k)
     &    *0.25*( vFld(i,j  )+vFld(i-1,j  )
     &           +vFld(i,j+1)+vFld(i-1,j+1)
     &          )*tanPhiAtU(i,j,bi,bj)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_U_XVISCFLUX(
     I        bi,bj,k,
     I        uFld, del2u,
     O        xViscFluxU,
     I        viscAh_D,viscA4_D,
     I        myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 del2u(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 xViscFluxU(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER I,J
      DO j=1-Oly,sNy+Oly-1
       DO i=1-Olx,sNx+Olx-1
        xViscFluxU(i,j) =
     &    dyF(i,j,bi,bj)*drF(k)*hFacC(i,j,k,bi,bj)
     &     *(
     &       -viscAh_D(i,j)*( uFld(i+1,j)-uFld(i,j) )
     &       *cosFacU(J,bi,bj)
     &       +viscA4_D(i,j)*(del2u(i+1,j)-del2u(i,j))
     &       *cosFacU(J,bi,bj)
     &      )*recip_dxF(i,j,bi,bj)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_U_YVISCFLUX(
     I        bi,bj,k,
     I        uFld, del2u, hFacZ,
     O        yViscFluxU,
     I        viscAh_Z,viscA4_Z,
     I        myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 del2u(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 yViscFluxU(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER I,J
      DO j=1-Oly+1,sNy+Oly
       DO i=1-Olx,sNx+Olx
        yViscFluxU(i,j) =
     &    dxV(i,j,bi,bj)*drF(k)*hFacZ(i,j)
     &     *(
     &       -viscAh_Z(i,j)*( uFld(i,j)-uFld(i,j-1) )
     &       +viscA4_Z(i,j)*(del2u(i,j)-del2u(i,j-1))
     &      )*recip_dyU(i,j,bi,bj)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_V_ADV_UV(
     I        bi,bj,k,
     I        uTrans, vFld,
     O        AdvectFluxUV,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 AdvectFluxUV(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      DO j=1-Oly+1,sNy+Oly
       DO i=1-Olx+1,sNx+Olx
        AdvectFluxUV(i,j) =
     &  0.25*( uTrans(i,j) + uTrans(i,j-1) )
     &      *(   vFld(i,j) +   vFld(i-1,j) )
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_V_ADV_VV(
     I        bi,bj,k,
     I        vTrans, vFld,
     O        AdvectFluxVV,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 AdvectFluxVV(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      DO j=1-Oly,sNy+Oly-1
       DO i=1-Olx,sNx+Olx-1
        AdvectFluxVV(i,j) =
     &  0.25*( vTrans(i,j) + vTrans(i,j+1) )
     &      *(   vFld(i,j) +   vFld(i,j+1) )
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_V_ADV_WV(
     I        bi,bj,k,
     I        vFld,wFld,rTrans,
     O        advectiveFluxWV,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 wFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 advectiveFluxWV(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      IF ( k.EQ.Nr+1 .AND.
     &     useRealFreshWaterFlux .AND. usingPCoords ) THEN
       DO j=1-Oly+1,sNy+Oly
        DO i=1-Olx+1,sNx+Olx
         advectiveFluxWV(i,j) = rTrans(i,j)*vFld(i,j,k-1,bi,bj)
        ENDDO
       ENDDO
      ELSEIF ( k.GT.Nr .OR. (k.EQ.1.AND.rigidLid) ) THEN
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
        advectiveFluxWV(i,j) = 0.
       ENDDO
      ENDDO
      ELSEIF (k.EQ.1) THEN
      DO j=1-Oly+1,sNy+Oly
       DO i=1-Olx+1,sNx+Olx
        advectiveFluxWV(i,j) = rTrans(i,j)*vFld(i,j,k,bi,bj)
       ENDDO
      ENDDO
      ELSE
      DO j=1-Oly+1,sNy+Oly
       DO i=1-Olx+1,sNx+Olx
        advectiveFluxWV(i,j) = rTrans(i,j)*
     &   0.5d0*( vFld(i,j,k,bi,bj)+vFld(i,j,k-1,bi,bj) )
       ENDDO
      ENDDO
      IF ( select_rStar.EQ.0 .AND. .NOT.rigidLid ) THEN
        DO j=1-Oly+1,sNy+Oly
         DO i=1-Olx+1,sNx+Olx
          advectiveFluxWV(i,j) = advectiveFluxWV(i,j)
     &     +0.25*(
     &          wFld(i, j ,k,bi,bj)*rA(i, j ,bi,bj)*
     &          (maskC(i, j ,k,bi,bj)-maskC(i, j ,k-1,bi,bj))
     &         +wFld(i,j-1,k,bi,bj)*rA(i,j-1,bi,bj)*
     &          (maskC(i,j-1,k,bi,bj)-maskC(i,j-1,k-1,bi,bj))
     &           )*deepFac2F(k)*rhoFacF(k)
     &            *vFld(i,j,k,bi,bj)
         ENDDO
        ENDDO
      ENDIF
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_V_CORIOLIS(
     I        bi,bj,k,uFld,
     U        vCoriolisTerm,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 vCoriolisTerm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      Real*8 one
      PARAMETER( one = 1.d0 )
      IF (useEnergyConservingCoriolis) THEN
       DO j=1-Oly+1,sNy+Oly
        DO i=1-Olx,sNx+Olx-1
         vCoriolisTerm(i,j) =
     &    -0.5*( fCori(i, j ,bi,bj)
     &          *0.5*( uFld( i , j )+uFld(i+1, j ) )
     &         + fCori(i,j-1,bi,bj)
     &          *0.5*( uFld( i ,j-1)+uFld(i+1,j-1) ) )
        ENDDO
       ENDDO
      ELSE
       DO j=1-Oly+1,sNy+Oly
        DO i=1-Olx,sNx+Olx-1
        vCoriolisTerm(i,j) =
     &    -0.5*(fCori(i, j ,bi,bj)+fCori(i,j-1,bi,bj))
     &   *0.25*( uFld(i, j )+uFld(i+1, j )
     &          +uFld(i,j-1)+uFld(i+1,j-1)
     &         )
        ENDDO
       ENDDO
      ENDIF
      IF (useJamartWetPoints) THEN
       DO j=1-Oly+1,sNy+Oly
        DO i=1-Olx,sNx+Olx-1
         vCoriolisTerm(i,j) = vCoriolisTerm(i,j)
     &   *4.d0/MAX( one,
     &                 maskW( i , j ,k,bi,bj)+maskW(i+1, j ,k,bi,bj)
     &                +maskW( i ,j-1,k,bi,bj)+maskW(i+1,j-1,k,bi,bj) )
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_V_DEL2V(
     I        bi,bj,k,
     I        vFld, hFacZ,
     O        del2v,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 del2v(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER I,J
      Real*8 fZon(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 fMer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hFacZClosedE,hFacZClosedW
      DO j=1-Oly+1,sNy+Oly-1
       DO i=1-Olx+1,sNx+Olx
        fZon(i,j) = drF(k)*hFacZ(i,j)
     &   *dyU(i,j,bi,bj)
     &   *recip_dxV(i,j,bi,bj)
     &   *(vFld(i,j)-vFld(i-1,j))
       ENDDO
      ENDDO
      DO j=1-Oly,sNy+Oly-1
       DO i=1-Olx+1,sNx+Olx-1
        fMer(i,j) = drF(k)*hFacC(i,j,k,bi,bj)
     &   *dxF(i,j,bi,bj)
     &   *recip_dyF(i,j,bi,bj)
     &   *(vFld(i,j+1)-vFld(i,j))
       ENDDO
      ENDDO
      DO j=1-Oly+1,sNy+Oly-1
       DO i=1-Olx+1,sNx+Olx-1
        del2v(i,j) =
     &   recip_drF(k)*recip_hFacS(i,j,k,bi,bj)
     &  *recip_rAs(i,j,bi,bj)*recip_deepFac2C(k)
     &  *( fZon(i+1,j)    - fZon(i, j )
     &    +fMer( i ,j)    - fMer(i,j-1)
     &   )*maskS(i,j,k,bi,bj)
       ENDDO
      ENDDO
      IF (no_slip_sides) THEN
      DO j=1-Oly+1,sNy+Oly-1
       DO i=1-Olx+1,sNx+Olx-1
        hFacZClosedW = hFacS(i,j,k,bi,bj) - hFacZ(i,j)
        hFacZClosedE = hFacS(i,j,k,bi,bj) - hFacZ(i+1,j)
        del2v(i,j) = del2v(i,j)
     &  -recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
     &   *recip_rAs(i,j,bi,bj)*recip_deepFac2C(k)
     &   *( hFacZClosedW*dyU( i ,j,bi,bj)
     &      *recip_dxV( i ,j,bi,bj)
     &     +hFacZClosedE*dyU(i+1,j,bi,bj)
     &      *recip_dxV(i+1,j,bi,bj)
     &    )*drF(k)*2.*vFld(i,j)
     &     *maskS(i,j,k,bi,bj)
       ENDDO
      ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_V_METRIC_CYLINDER(
     I        bi,bj,k,
     I        uFld, vFld,
     O        vMetricTerms,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 vMetricTerms(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      Real*8 radius
      DO j=1-Oly+1,sNy+Oly
       DO i=1-Olx,sNx+Olx-1
          radius = (yG(i,j,bi,bj)+yG(i+1,j,bi,bj))*0.5d0
          IF ( radius.GT.0. ) THEN 
             vMetricTerms(i,j) = 
     &           -0.25*(uFld(i,j) + uFld(i+1,j) +
     &                  uFld(i,j-1)+uFld(i+1,j-1)) 
     &           *0.25*(uFld(i,j) + uFld(i+1,j) +
     &                  uFld(i,j-1)+uFld(i+1,j-1))/radius
          ELSE
             vMetricTerms(i,j) = 0.
          ENDIF
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_V_METRIC_SPHERE(
     I        bi,bj,k,
     I        uFld,
     O        vMetricTerms,
     I        myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 vMetricTerms(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j
      DO j=1-Olx+1,sNy+Oly
       DO i=1-Olx,sNx+Olx-1
         vMetricTerms(i,j) = -recip_rSphere*recip_deepFacC(k)
     &    *0.25*( uFld(i,j  )+uFld(i+1,j  )
     &           +uFld(i,j-1)+uFld(i+1,j-1)
     &          )
     &    *0.25*( uFld(i,j  )+uFld(i+1,j  )
     &           +uFld(i,j-1)+uFld(i+1,j-1)
     &          )
     &    *tanPhiAtV(i,j,bi,bj)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_V_XVISCFLUX(
     I        bi,bj,k,
     I        vFld, del2v, hFacZ,
     O        xViscFluxV,
     I        viscAh_Z,viscA4_Z,
     I        myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 del2v(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 xViscFluxV(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER I,J
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx+1,sNx+Olx
        xViscFluxV(i,j) =
     &    dyU(i,j,bi,bj)*drF(k)*hFacZ(i,j)
     &     *(
     &       -viscAh_Z(i,j)*( vFld(i,j)-vFld(i-1,j) )
     &       *cosFacV(J,bi,bj)
     &       +viscA4_Z(i,j)*(del2v(i,j)-del2v(i-1,j))
     &       *cosFacV(J,bi,bj)
     &      )*recip_dxV(i,j,bi,bj)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_V_YVISCFLUX(
     I        bi,bj,k,
     I        vFld, del2v,
     O        yViscFluxV,
     I        viscAh_D,viscA4_D,
     I        myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 del2v(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      Real*8 yViscFluxV(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER I,J
      DO j=1-Oly,sNy+Oly-1
       DO i=1-Olx,sNx+Olx-1
        yViscFluxV(i,j) =
     &    dxF(i,j,bi,bj)*drF(k)*hFacC(i,j,k,bi,bj)
     &     *(
     &       -viscAh_D(i,j)*( vFld(i,j+1)-vFld(i,j) )
     &       +viscA4_D(i,j)*(del2v(i,j+1)-del2v(i,j))
     &      )*recip_dyF(i,j,bi,bj)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_VECINV(
     I        bi,bj,iMin,iMax,jMin,jMax,k,kUp,kDown,
     I        KappaRU, KappaRV,
     U        fVerU, fVerV,
     O        guDiss, gvDiss,
     I        myTime, myIter, myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TAVE_TIME/ timeAve_half, timeAve_full
      Real*8 timeAve_half(nSx,nSy)
      Real*8 timeAve_full(nSx,nSy)
      COMMON /TAVE_STATEVARS/
     &                  uFluxtave,vFluxtave,tFluxtave,sFluxtave
     &                 ,etatave,uVeltave,vVeltave,wVeltave
     &                 ,thetatave,salttave,phiHydLowtave
     &                 ,UTtave,VTtave,WTtave,UStave,VStave,WStave
     &                 ,Eta2tave,TTtave,UUtave,VVtave,UVtave
     &                 ,TdiffRtave
     &                 ,uZetatave, vZetatave
     &                 ,phiHydtave
     &                 ,phiHydLow2Tave
     &                 ,ConvectCountTave
      Real*8  uFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  vFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  etatave  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  thetatave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salttave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydLowtave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  UTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  WTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  WStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  eta2Tave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  TTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UUtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VVtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UVtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 TdiffRtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 uZetatave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 vZetatave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydLow2Tave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 ConvectCountTave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      Real*8 KappaRU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 KappaRV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 fVerU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
      Real*8 fVerV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
      Real*8 guDiss(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 gvDiss(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER kUp,kDown
      Real*8     myTime
      INTEGER myIter
      INTEGER myThid
      INTEGER bi,bj,iMin,iMax,jMin,jMax
      LOGICAL  DIFFERENT_MULTIPLE
      EXTERNAL DIFFERENT_MULTIPLE
      Real*8      vF (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8      vrF(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8      uCf(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8      vCf(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hFacZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 r_hFacZ (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uFld    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 del2u   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 del2v   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 dStar   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 zStar   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tension (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 strain  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 KE      (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 omega3  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vort3   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hDiv    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER i,j,k
      Real*8  ArDudrFac
      Real*8  ArDvdrFac
      Real*8  sideMaskFac
      LOGICAL bottomDragTerms
      LOGICAL writeDiag
      LOGICAL harmonic,biharmonic,useVariableViscosity
      INTEGER imomkey
      fVerU(1,1,kUp) = fVerU(1,1,kUp)
      fVerV(1,1,kUp) = fVerV(1,1,kUp)
          act0 = k - 1
          max0 = Nr
          act1 = bi - myBxLo(myThid)
          max1 = myBxHi(myThid) - myBxLo(myThid) + 1
          act2 = bj - myByLo(myThid)
          max2 = myByHi(myThid) - myByLo(myThid) + 1
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = ikey_dynamics - 1
          imomkey = (act0 + 1)
     &                    + act1*max0
     &                    + act2*max0*max1
     &                    + act3*max0*max1*max2
     &                    + act4*max0*max1*max2*max3
      writeDiag = DIFFERENT_MULTIPLE(diagFreq, myTime, deltaTClock)
      DO j=1-OLy,sNy+OLy
       DO i=1-OLx,sNx+OLx
        vF(i,j)    = 0.
        vrF(i,j)   = 0.
        uCf(i,j)   = 0.
        vCf(i,j)   = 0.
        del2u(i,j) = 0.
        del2v(i,j) = 0.
        dStar(i,j) = 0.
        zStar(i,j) = 0.
        guDiss(i,j)= 0.
        gvDiss(i,j)= 0.
        vort3(i,j) = 0.
        omega3(i,j)= 0.
        KE(i,j)    = 0.
        hDiv(i,j)  = 0.
        viscAh_Z(i,j) = 0.
        viscAh_D(i,j) = 0.
        viscA4_Z(i,j) = 0.
        viscA4_D(i,j) = 0.
        strain(i,j)  = 0.d0
        tension(i,j) = 0.d0
        hFacZ(i,j)   = 0.d0
       ENDDO
      ENDDO
      ArDudrFac    = vfFacMom*1.
      ArDvdrFac    = vfFacMom*1.
      IF ( no_slip_sides ) THEN
        sideMaskFac = sideDragFactor
      ELSE
        sideMaskFac = 0.d0
      ENDIF
      IF (     no_slip_bottom
     &    .OR. bottomDragQuadratic.NE.0.
     &    .OR. bottomDragLinear.NE.0.) THEN
       bottomDragTerms=.TRUE.
      ELSE
       bottomDragTerms=.FALSE.
      ENDIF
      CALL MOM_CALC_HFACZ(bi,bj,k,hFacZ,r_hFacZ,myThid)
      DO j=1-OLy,sNy+OLy
       DO i=1-OLx,sNx+OLx
        uFld(i,j) = uVel(i,j,k,bi,bj)
        vFld(i,j) = vVel(i,j,k,bi,bj)
       ENDDO
      ENDDO
      CALL MOM_CALC_KE(bi,bj,k,selectKEscheme,uFld,vFld,KE,myThid)
      CALL MOM_CALC_RELVORT3(bi,bj,k,uFld,vFld,hFacZ,vort3,myThid)
      IF (momViscosity) THEN
CADJ STORE vort3(:,:) =
CADJ &     comlev1_bibj_k, key = imomkey, byte = isbyte
       CALL MOM_CALC_HDIV(bi,bj,k,2,uFld,vFld,hDiv,myThid)
       CALL MOM_CALC_TENSION(bi,bj,k,uFld,vFld,tension,myThid)
       CALL MOM_CALC_STRAIN(bi,bj,k,uFld,vFld,hFacZ,strain,myThid)
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
          IF ( hFacZ(i,j).EQ.0. ) THEN
            vort3(i,j)  = sideMaskFac*vort3(i,j)
            strain(i,j) = sideMaskFac*strain(i,j)
          ENDIF
        ENDDO
       ENDDO
       CALL MOM_CALC_VISC(
     I        bi,bj,k,
     O        viscAh_Z,viscAh_D,viscA4_Z,viscA4_D,
     O        harmonic,biharmonic,useVariableViscosity,
     I        hDiv,vort3,tension,strain,KE,hfacZ,
     I        myThid)
       IF (biharmonic) THEN
         CALL MOM_VI_DEL2UV(bi,bj,k,hDiv,vort3,hFacZ,
     O                      del2u,del2v,
     &                      myThid)
         CALL MOM_CALC_HDIV(bi,bj,k,2,del2u,del2v,dStar,myThid)
         CALL MOM_CALC_RELVORT3(bi,bj,k,
     &                          del2u,del2v,hFacZ,zStar,myThid)
       ENDIF
       IF ( writeDiag ) THEN
        IF (snapshot_mdsio) THEN
          CALL WRITE_LOCAL_RL('Ds','I10',1,strain,bi,bj,k,myIter,myThid)
        ENDIF
       ENDIF
       IF (useStrainTensionVisc) THEN
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
            IF ( hFacZ(i,j).EQ.0. ) strain(i,j) = 0.d0
          ENDDO
         ENDDO
         CALL MOM_HDISSIP(bi,bj,k,hDiv,vort3,tension,strain,KE,
     I                    hFacZ,
     I                    viscAh_Z,viscAh_D,viscA4_Z,viscA4_D,
     I                    harmonic,biharmonic,useVariableViscosity,
     O                    guDiss,gvDiss,
     I                    myThid)
       ELSE
         CALL MOM_VI_HDISSIP(bi,bj,k,hDiv,vort3,tension,strain,KE,
     I                       hFacZ,dStar,zStar,
     I                       viscAh_Z,viscAh_D,viscA4_Z,viscA4_D,
     I                       harmonic,biharmonic,useVariableViscosity,
     O                       guDiss,gvDiss,
     &                       myThid)
       ENDIF
      ENDIF
      IF (momViscosity.AND..NOT.implicitViscosity) THEN
       CALL MOM_U_RVISCFLUX(bi,bj,k+1,uVel,KappaRU,vrF,myThid)
       DO j=jMin,jMax
        DO i=iMin,iMax
         fVerU(i,j,kDown) = ArDudrFac*vrF(i,j)
        ENDDO
       ENDDO
       DO j=2-Oly,sNy+Oly-1
        DO i=2-Olx,sNx+Olx-1
         guDiss(i,j) = guDiss(i,j)
     &   -recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
     &   *recip_rAw(i,j,bi,bj)
     &  *(
     &    fVerU(i,j,kDown) - fVerU(i,j,kUp)
     &   )*rkSign
        ENDDO
       ENDDO
      ENDIF
      IF (momViscosity.AND.no_slip_sides) THEN
       CALL MOM_U_SIDEDRAG(
     I        bi,bj,k,
     I        uFld, del2u, hFacZ,
     I        viscAh_Z,viscA4_Z,
     I        harmonic,biharmonic,useVariableViscosity,
     O        vF,
     I        myThid)
       DO j=jMin,jMax
        DO i=iMin,iMax
         guDiss(i,j) = guDiss(i,j)+vF(i,j)
        ENDDO
       ENDDO
      ENDIF
      IF (momViscosity.AND.bottomDragTerms) THEN
       CALL MOM_U_BOTTOMDRAG(bi,bj,k,uFld,KE,KappaRU,vF,myThid)
       DO j=jMin,jMax
        DO i=iMin,iMax
         guDiss(i,j) = guDiss(i,j)+vF(i,j)
        ENDDO
       ENDDO
      ENDIF
      IF (momViscosity.AND..NOT.implicitViscosity) THEN
       CALL MOM_V_RVISCFLUX(bi,bj,k+1,vVel,KappaRV,vrF,myThid)
       DO j=jMin,jMax
        DO i=iMin,iMax
         fVerV(i,j,kDown) = ArDvdrFac*vrF(i,j)
        ENDDO
       ENDDO
       DO j=jMin,jMax
        DO i=iMin,iMax
         gvDiss(i,j) = gvDiss(i,j)
     &   -recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
     &    *recip_rAs(i,j,bi,bj)
     &  *(
     &    fVerV(i,j,kDown) - fVerV(i,j,kUp)
     &   )*rkSign
        ENDDO
       ENDDO
      ENDIF
      IF (momViscosity.AND.no_slip_sides) THEN
       CALL MOM_V_SIDEDRAG(
     I        bi,bj,k,
     I        vFld, del2v, hFacZ,
     I        viscAh_Z,viscA4_Z,
     I        harmonic,biharmonic,useVariableViscosity,
     O        vF,
     I        myThid)
       DO j=jMin,jMax
        DO i=iMin,iMax
         gvDiss(i,j) = gvDiss(i,j)+vF(i,j)
        ENDDO
       ENDDO
      ENDIF
      IF (momViscosity.AND.bottomDragTerms) THEN
       CALL MOM_V_BOTTOMDRAG(bi,bj,k,vFld,KE,KappaRV,vF,myThid)
       DO j=jMin,jMax
        DO i=iMin,iMax
         gvDiss(i,j) = gvDiss(i,j)+vF(i,j)
        ENDDO
       ENDDO
      ENDIF
      IF ( writeDiag ) THEN
        IF (snapshot_mdsio) THEN
          CALL WRITE_LOCAL_RL('Z3','I10',1,vort3, bi,bj,k,myIter,myThid)
        ENDIF
      ENDIF
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
         IF ( hFacZ(i,j).EQ.0. ) vort3(i,j) = 0.
       ENDDO
      ENDDO
      IF (useAbsVorticity)
     &  CALL MOM_CALC_ABSVORT3(bi,bj,k,vort3,omega3,myThid)
      IF ( useCoriolis .AND.
     &     .NOT.( useCDscheme .OR. useAbsVorticity.AND.momAdvection )
     &   ) THEN
       IF (useAbsVorticity) THEN
        CALL MOM_VI_U_CORIOLIS(bi,bj,K,vFld,omega3,hFacZ,r_hFacZ,
     &                         uCf,myThid)
        CALL MOM_VI_V_CORIOLIS(bi,bj,K,uFld,omega3,hFacZ,r_hFacZ,
     &                         vCf,myThid)
       ELSE
        CALL MOM_VI_CORIOLIS(bi,bj,k,uFld,vFld,hFacZ,r_hFacZ,
     &                       uCf,vCf,myThid)
       ENDIF
       DO j=jMin,jMax
        DO i=iMin,iMax
         gU(i,j,k,bi,bj) = uCf(i,j)
         gV(i,j,k,bi,bj) = vCf(i,j)
        ENDDO
       ENDDO
       IF ( writeDiag ) THEN
         IF (snapshot_mdsio) THEN
           CALL WRITE_LOCAL_RL('fV','I10',1,uCf,bi,bj,k,myIter,myThid)
           CALL WRITE_LOCAL_RL('fU','I10',1,vCf,bi,bj,k,myIter,myThid)
         ENDIF
       ENDIF
      ELSE
       DO j=jMin,jMax
        DO i=iMin,iMax
         gU(i,j,k,bi,bj) = 0.d0
         gV(i,j,k,bi,bj) = 0.d0
        ENDDO
       ENDDO
      ENDIF
      IF (momAdvection) THEN
       IF ( (highOrderVorticity.OR.upwindVorticity)
     &     .AND.useAbsVorticity ) THEN
        CALL MOM_VI_U_CORIOLIS_C4(bi,bj,k,vFld,omega3,r_hFacZ,
     &                         uCf,myThid)
       ELSEIF ( (highOrderVorticity.OR.upwindVorticity) ) THEN
        CALL MOM_VI_U_CORIOLIS_C4(bi,bj,k,vFld,vort3, r_hFacZ,
     &                         uCf,myThid)
       ELSEIF ( useAbsVorticity ) THEN
        CALL MOM_VI_U_CORIOLIS(bi,bj,K,vFld,omega3,hFacZ,r_hFacZ,
     &                         uCf,myThid)
       ELSE
        CALL MOM_VI_U_CORIOLIS(bi,bj,k,vFld,vort3, hFacZ,r_hFacZ,
     &                         uCf,myThid)
       ENDIF
       DO j=jMin,jMax
        DO i=iMin,iMax
         gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+uCf(i,j)
        ENDDO
       ENDDO
       IF ( (highOrderVorticity.OR.upwindVorticity)
     &     .AND.useAbsVorticity ) THEN
        CALL MOM_VI_V_CORIOLIS_C4(bi,bj,K,uFld,omega3,r_hFacZ,
     &                         vCf,myThid)
       ELSEIF ( (highOrderVorticity.OR.upwindVorticity) ) THEN
        CALL MOM_VI_V_CORIOLIS_C4(bi,bj,K,uFld,vort3, r_hFacZ,
     &                         vCf,myThid)
       ELSEIF ( useAbsVorticity ) THEN
        CALL MOM_VI_V_CORIOLIS(bi,bj,K,uFld,omega3,hFacZ,r_hFacZ,
     &                         vCf,myThid)
       ELSE
        CALL MOM_VI_V_CORIOLIS(bi,bj,k,uFld,vort3, hFacZ,r_hFacZ,
     &                         vCf,myThid)
       ENDIF
       DO j=jMin,jMax
        DO i=iMin,iMax
         gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+vCf(i,j)
        ENDDO
       ENDDO
       IF ( writeDiag ) THEN
         IF (snapshot_mdsio) THEN
           CALL WRITE_LOCAL_RL('zV','I10',1,uCf,bi,bj,k,myIter,myThid)
           CALL WRITE_LOCAL_RL('zU','I10',1,vCf,bi,bj,k,myIter,myThid)
         ENDIF
       ENDIF
       IF (taveFreq.GT.0.) THEN
         CALL TIMEAVE_CUMUL_1K1T(uZetatave,vCf,deltaTClock,
     &                           Nr, k, bi, bj, myThid)
         CALL TIMEAVE_CUMUL_1K1T(vZetatave,uCf,deltaTClock,
     &                           Nr, k, bi, bj, myThid)
       ENDIF
       IF ( .NOT. momImplVertAdv ) THEN
        CALL MOM_VI_U_VERTSHEAR(bi,bj,K,uVel,wVel,uCf,myThid)
        DO j=jMin,jMax
         DO i=iMin,iMax
          gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+uCf(i,j)
         ENDDO
        ENDDO
        CALL MOM_VI_V_VERTSHEAR(bi,bj,K,vVel,wVel,vCf,myThid)
        DO j=jMin,jMax
         DO i=iMin,iMax
          gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+vCf(i,j)
         ENDDO
        ENDDO
       ENDIF
       CALL MOM_VI_U_GRAD_KE(bi,bj,K,KE,uCf,myThid)
       DO j=jMin,jMax
        DO i=iMin,iMax
         gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+uCf(i,j)
        ENDDO
       ENDDO
       CALL MOM_VI_V_GRAD_KE(bi,bj,K,KE,vCf,myThid)
       DO j=jMin,jMax
        DO i=iMin,iMax
         gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+vCf(i,j)
        ENDDO
       ENDDO
       IF ( writeDiag ) THEN
         IF (snapshot_mdsio) THEN
           CALL WRITE_LOCAL_RL('KEx','I10',1,uCf,bi,bj,k,myIter,myThid)
           CALL WRITE_LOCAL_RL('KEy','I10',1,vCf,bi,bj,k,myIter,myThid)
         ENDIF
       ENDIF
      ENDIF
      IF ( use3dCoriolis ) THEN
        CALL MOM_U_CORIOLIS_NH(bi,bj,k,wVel,uCf,myThid)
        DO j=jMin,jMax
         DO i=iMin,iMax
          gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+uCf(i,j)
         ENDDO
        ENDDO
       IF ( usingCurvilinearGrid ) THEN
        CALL MOM_V_CORIOLIS_NH(bi,bj,k,wVel,vCf,myThid)
        DO j=jMin,jMax
         DO i=iMin,iMax
          gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+vCf(i,j)
         ENDDO
        ENDDO
       ENDIF
      ENDIF
      IF ( useNHMTerms ) THEN
       CALL MOM_U_METRIC_NH(bi,bj,k,uFld,wVel,uCf,myThid)
       DO j=jMin,jMax
        DO i=iMin,iMax
         gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)+uCf(i,j)
        ENDDO
       ENDDO
       CALL MOM_V_METRIC_NH(bi,bj,k,vFld,wVel,vCf,myThid)
       DO j=jMin,jMax
        DO i=iMin,iMax
         gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)+vCf(i,j)
        ENDDO
       ENDDO
      ENDIF
      DO j=jMin,jMax
       DO i=iMin,iMax
        gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj)*maskW(i,j,k,bi,bj)
        gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)*maskS(i,j,k,bi,bj)
       ENDDO
      ENDDO
      IF ( debugLevel .GE. debLevB
     &   .AND. k.EQ.4 .AND. myIter.EQ.nIter0
     &   .AND. nPx.EQ.1 .AND. nPy.EQ.1
     &   .AND. useCubedSphereExchange ) THEN
        CALL DEBUG_CS_CORNER_UV( ' uDiss,vDiss from MOM_VECINV',
     &             guDiss,gvDiss, k, standardMessageUnit,bi,bj,myThid )
      ENDIF
      IF ( writeDiag ) THEN
        IF (snapshot_mdsio) THEN
         CALL WRITE_LOCAL_RL('W3','I10',1,omega3, bi,bj,k,myIter,myThid)
         CALL WRITE_LOCAL_RL('KE','I10',1,KE,     bi,bj,k,myIter,myThid)
         CALL WRITE_LOCAL_RL('D', 'I10',1,hDiv,   bi,bj,k,myIter,myThid)
         CALL WRITE_LOCAL_RL('Dt','I10',1,tension,bi,bj,k,myIter,myThid)
         CALL WRITE_LOCAL_RL('Du','I10',1,guDiss, bi,bj,k,myIter,myThid)
         CALL WRITE_LOCAL_RL('Dv','I10',1,gvDiss, bi,bj,k,myIter,myThid)
        ENDIF
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_VI_CORIOLIS(
     I        bi,bj,K,
     I        uFld,vFld,hFacZ,r_hFacZ,
     O        uCoriolisTerm,vCoriolisTerm,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER bi,bj,K
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 r_hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uCoriolisTerm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vCoriolisTerm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      INTEGER I,J
      Real*8 vBarXY,uBarXY
      Real*8 epsil
      epsil = 1.D-9
      IF (useJamartWetPoints) THEN
       DO J=1-Oly,sNy+Oly-1
        DO I=2-Olx,sNx+Olx
         vBarXY=(
     &      (vFld( i , j )*dxG( i , j ,bi,bj)*hFacS( i , j ,k,bi,bj)
     &      +vFld(i-1, j )*dxG(i-1, j ,bi,bj)*hFacS(i-1, j ,k,bi,bj))
     &     +(vFld( i ,j+1)*dxG( i ,j+1,bi,bj)*hFacS( i ,j+1,k,bi,bj)
     &      +vFld(i-1,j+1)*dxG(i-1,j+1,bi,bj)*hFacS(i-1,j+1,k,bi,bj)))
     &   / MAX( epsil,(hFacS(i, j ,k,bi,bj)+hFacS(i-1, j ,k,bi,bj))
     &               +(hFacS(i,j+1,k,bi,bj)+hFacS(i-1,j+1,k,bi,bj)) )
         uCoriolisTerm(i,j)=
     &    +0.5*( fCoriG(i,j,bi,bj)+fCoriG(i,j+1,bi,bj)
     &         )*vBarXY*recip_dxC(i,j,bi,bj)*maskW(I,J,K,bi,bj)
        ENDDO
       ENDDO
      ELSE
       DO J=1-Oly,sNy+Oly-1
        DO I=2-Olx,sNx+Olx
         vBarXY=0.25*(
     &      (vFld( i , j )*dxG( i , j ,bi,bj)
     &      +vFld(i-1, j )*dxG(i-1, j ,bi,bj))
     &     +(vFld( i ,j+1)*dxG( i ,j+1,bi,bj)
     &      +vFld(i-1,j+1)*dxG(i-1,j+1,bi,bj))
     &               )
         uCoriolisTerm(i,j)=
     &    +0.5*( fCoriG(i,j,bi,bj)+fCoriG(i,j+1,bi,bj)
     &         )*vBarXY*recip_dxC(i,j,bi,bj)*maskW(I,J,K,bi,bj)
        ENDDO
       ENDDO
      ENDIF
      IF (useJamartWetPoints) THEN
       DO J=2-Oly,sNy+Oly
        DO I=1-Olx,sNx+Olx-1
         uBarXY=(
     &      (uFld( i , j )*dyG( i , j ,bi,bj)*hFacW( i , j ,k,bi,bj)
     &      +uFld( i ,j-1)*dyG( i ,j-1,bi,bj)*hFacW( i ,j-1,k,bi,bj))
     &     +(uFld(i+1, j )*dyG(i+1, j ,bi,bj)*hFacW(i+1, j ,k,bi,bj)
     &      +uFld(i+1,j-1)*dyG(i+1,j-1,bi,bj)*hFacW(i+1,j-1,k,bi,bj)))
     &   / MAX( epsil,(hFacW( i ,j,k,bi,bj)+hFacW( i ,j-1,k,bi,bj))
     &               +(hFacW(i+1,j,k,bi,bj)+hFacW(i+1,j-1,k,bi,bj)) )
         vCoriolisTerm(i,j)=
     &    -0.5*( fCoriG(i,j,bi,bj)+fCoriG(i+1,j,bi,bj)
     &         )*uBarXY*recip_dyC(i,j,bi,bj)*maskS(I,J,K,bi,bj)
        ENDDO
       ENDDO
      ELSE
       DO J=2-Oly,sNy+Oly
        DO I=1-Olx,sNx+Olx-1
         uBarXY=0.25*(
     &      (uFld( i , j )*dyG( i , j ,bi,bj)
     &      +uFld( i ,j-1)*dyG( i ,j-1,bi,bj))
     &     +(uFld(i+1, j )*dyG(i+1, j ,bi,bj)
     &      +uFld(i+1,j-1)*dyG(i+1,j-1,bi,bj))
     &               )
         vCoriolisTerm(i,j)=
     &    -0.5*( fCoriG(i,j,bi,bj)+fCoriG(i+1,j,bi,bj)
     &         )*uBarXY*recip_dyC(i,j,bi,bj)*maskS(I,J,K,bi,bj)
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_VI_DEL2UV(
     I        bi,bj,k,
     I        hDiv,vort3,hFacZ,
     O        del2u,del2v,
     I        myThid)
      IMPLICIT NONE
C
C
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER bi,bj,k
      Real*8 hDiv(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vort3(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 del2u(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 del2v(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      INTEGER i,j
      IF (useCubedSphereExchange) THEN
        CALL FILL_CS_CORNER_TR_RL( 1, .FALSE.,
     &                             hDiv, bi,bj, myThid )
      ENDIF
      DO j=2-Oly,sNy+Oly-1
       DO i=2-Olx,sNx+Olx-1
        del2u(i,j) =
     &   +     ( hDiv(i,j) - hDiv(i-1,j) )*recip_DXC(i,j,bi,bj)
     &   -recip_hFacW(i,j,k,bi,bj)*
     &         ( hFacZ(i,j+1)*vort3(i,j+1) - hFacZ(i,j)*vort3(i,j) )
     &                                    *recip_DYG(i,j,bi,bj)
       ENDDO
      ENDDO
      IF (useCubedSphereExchange) THEN
        CALL FILL_CS_CORNER_TR_RL( 2, .FALSE.,
     &                             hDiv, bi,bj, myThid )
      ENDIF
      DO j=2-Oly,sNy+Oly-1
       DO i=2-Olx,sNx+Olx-1
        del2v(i,j) =
     &   +     ( hDiv(i,j) - hDiv(i,j-1) )*recip_DYC(i,j,bi,bj)
     &   +recip_hFacS(i,j,k,bi,bj)*
     &         ( hFacZ(i+1,j)*vort3(i+1,j) - hFacZ(i,j)*vort3(i,j) )
     &                                    *recip_DXG(i,j,bi,bj)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_VI_HDISSIP(
     I        bi,bj,k,
     I        hDiv,vort3,tension,strain,KE,
     I        hFacZ,dStar,zStar,
     I        viscAh_Z,viscAh_D,viscA4_Z,viscA4_D,
     I        harmonic,biharmonic,useVariableViscosity,
     O        uDissip,vDissip,
     I        myThid)
      IMPLICIT NONE
C
C
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER bi,bj,k
      Real*8 hDiv(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vort3(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tension(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 strain(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 KE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 dStar(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 zStar(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uDissip(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vDissip(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscAh_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_Z(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 viscA4_D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      LOGICAL harmonic, biharmonic, useVariableViscosity
      INTEGER myThid
      INTEGER I,J
      Real*8 Zip,Zij,Zpj,Dim,Dij,Dmj,uD2,vD2,uD4,vD4
      Real*8 Zip1,Zij1,Zpj1
      IF (harmonic) THEN
       DO j=2-Oly,sNy+Oly-1
        DO i=2-Olx,sNx+Olx-1
         IF (useVariableViscosity) THEN
          Dij=hDiv( i , j )*viscAh_D(i,j)
          Dim=hDiv( i ,j-1)*viscAh_D(i,j-1)
          Dmj=hDiv(i-1, j )*viscAh_D(i-1,j)
          Zij=hFacZ( i , j )*vort3( i , j )*viscAh_Z(i,j)
          Zip=hFacZ( i ,j+1)*vort3( i ,j+1)*viscAh_Z(i,j+1)
          Zpj=hFacZ(i+1, j )*vort3(i+1, j )*viscAh_Z(i+1,j)
          uD2 = (
     &               cosFacU(j,bi,bj)*( Dij-Dmj )*recip_DXC(i,j,bi,bj)
     &     -recip_hFacW(i,j,k,bi,bj)*( Zip-Zij )*recip_DYG(i,j,bi,bj) )
          vD2 = (
     &      recip_hFacS(i,j,k,bi,bj)*( Zpj-Zij )*recip_DXG(i,j,bi,bj)
     &                                           *cosFacV(j,bi,bj)
     &                               +( Dij-Dim )*recip_DYC(i,j,bi,bj) )
         ELSE
          Dim=hDiv( i ,j-1)
          Dij=hDiv( i , j )
          Dmj=hDiv(i-1, j )
          Zip=hFacZ( i ,j+1)*vort3( i ,j+1)
          Zij=hFacZ( i , j )*vort3( i , j )
          Zpj=hFacZ(i+1, j )*vort3(i+1, j )
          uD2 = viscAhD*
     &               cosFacU(j,bi,bj)*( Dij-Dmj )*recip_DXC(i,j,bi,bj)
     &        - viscAhZ*recip_hFacW(i,j,k,bi,bj)*
     &                                ( Zip-Zij )*recip_DYG(i,j,bi,bj)
          vD2 = viscAhZ*recip_hFacS(i,j,k,bi,bj)*
     &               cosFacV(j,bi,bj)*( Zpj-Zij )*recip_DXG(i,j,bi,bj)
     &        + viscAhD*              ( Dij-Dim )*recip_DYC(i,j,bi,bj)
         ENDIF
         uDissip(i,j) = uD2
         vDissip(i,j) = vD2
        ENDDO
       ENDDO
      ELSE
       DO j=2-Oly,sNy+Oly-1
        DO i=2-Olx,sNx+Olx-1
         uDissip(i,j) = 0.
         vDissip(i,j) = 0.
        ENDDO
       ENDDO
      ENDIF
      IF (biharmonic) THEN
       DO j=2-Oly,sNy+Oly-1
        DO i=2-Olx,sNx+Olx-1
         Dim=dStar( i ,j-1)
         Dij=dStar( i , j )
         Dmj=dStar(i-1, j )
         Zip1=hFacZ( i ,j+1)*zStar( i ,j+1)
         Zij1=hFacZ( i , j )*zStar( i , j )
         Zpj1=hFacZ(i+1, j )*zStar(i+1, j )
         IF (useVariableViscosity) THEN
          Dij=Dij*viscA4_D(i,j)
          Dim=Dim*viscA4_D(i,j-1)
          Dmj=Dmj*viscA4_D(i-1,j)
          Zij=Zij1*viscA4_Z(i,j)
          Zip=Zip1*viscA4_Z(i,j+1)
          Zpj=Zpj1*viscA4_Z(i+1,j)
          uD4 = (
     &               cosFacU(j,bi,bj)*( Dij-Dmj )*recip_DXC(i,j,bi,bj)
     &     -recip_hFacW(i,j,k,bi,bj)*( Zip-Zij )*recip_DYG(i,j,bi,bj) )
          vD4 = (
     &      recip_hFacS(i,j,k,bi,bj)*( Zpj-Zij )*recip_DXG(i,j,bi,bj)
     &                                           *cosFacV(j,bi,bj)
     &                               +( Dij-Dim )*recip_DYC(i,j,bi,bj) )
         ELSE
          Zij=Zij1
          Zip=Zip1
          Zpj=Zpj1
          uD4 = viscA4D*
     &               cosFacU(j,bi,bj)*( Dij-Dmj )*recip_DXC(i,j,bi,bj)
     &        - viscA4Z*recip_hFacW(i,j,k,bi,bj)*
     &                                ( Zip-Zij )*recip_DYG(i,j,bi,bj)
          vD4 = viscA4Z*recip_hFacS(i,j,k,bi,bj)*
     &               cosFacV(j,bi,bj)*( Zpj-Zij )*recip_DXG(i,j,bi,bj)
     &        + viscA4D*              ( Dij-Dim )*recip_DYC(i,j,bi,bj)
         ENDIF
         uDissip(i,j) = uDissip(i,j) - uD4
         vDissip(i,j) = vDissip(i,j) - vD4
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_VI_U_CORIOLIS(
     I                     bi, bj, k,
     I                     vFld, omega3, hFacZ, r_hFacZ,
     O                     uCoriolisTerm,
     I                     myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER bi, bj, k
      Real*8     vFld     (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8     omega3   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8     hFacZ    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8     r_hFacZ  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uCoriolisTerm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      LOGICAL upwindVort3
      INTEGER i, j
      Real*8     vBarXY, vBarXm, vBarXp
      Real*8     vort3u
      Real*8     vort3mj, vort3ij, vort3mp, vort3ip
      Real*8     oneThird, tmpFac
      Real*8     epsil
      PARAMETER( upwindVort3 = .FALSE. )
      epsil = 1.D-9
      tmpFac = 1.d0
      oneThird = 1.d0 / 3.d0
      IF ( selectVortScheme.EQ.0 ) THEN
       DO j=1-Oly,sNy+Oly-1
        DO i=2-Olx,sNx+Olx
         vBarXY=0.25*(
     &      (vFld( i , j )*dxG( i , j ,bi,bj)*hFacS( i , j ,k,bi,bj)
     &      +vFld(i-1, j )*dxG(i-1, j ,bi,bj)*hFacS(i-1, j ,k,bi,bj))
     &     +(vFld( i ,j+1)*dxG( i ,j+1,bi,bj)*hFacS( i ,j+1,k,bi,bj)
     &      +vFld(i-1,j+1)*dxG(i-1,j+1,bi,bj)*hFacS(i-1,j+1,k,bi,bj))
     &               )
         IF (upwindVort3) THEN
          IF (vBarXY.GT.0.) THEN
           vort3u=omega3(i,j)*r_hFacZ(i,j)
          ELSE
           vort3u=omega3(i,j+1)*r_hFacZ(i,j+1)
          ENDIF
         ELSE
           vort3u=0.5*(omega3(i,j)*r_hFacZ(i,j)
     &                +omega3(i,j+1)*r_hFacZ(i,j+1))
         ENDIF
         uCoriolisTerm(i,j)= +vort3u*vBarXY*recip_dxC(i,j,bi,bj)
     &                              * maskW(i,j,k,bi,bj)
        ENDDO
       ENDDO
      ELSEIF ( selectVortScheme.EQ.1 ) THEN
       DO j=1-Oly,sNy+Oly-1
        DO i=2-Olx,sNx+Olx
         vBarXY= 0.5*(
     &      (vFld( i , j )*dxG( i , j ,bi,bj)*hFacZ(i, j )
     &      +vFld(i-1, j )*dxG(i-1, j ,bi,bj)*hFacZ(i, j ))
     &     +(vFld( i ,j+1)*dxG( i ,j+1,bi,bj)*hFacZ(i,j+1)
     &      +vFld(i-1,j+1)*dxG(i-1,j+1,bi,bj)*hFacZ(i,j+1))
     &               )/MAX( epsil, hFacZ(i,j)+hFacZ(i,j+1) )
         IF (upwindVort3) THEN
          IF (vBarXY.GT.0.) THEN
           vort3u=omega3(i,j)
          ELSE
           vort3u=omega3(i,j+1)
          ENDIF
         ELSE
           vort3u=0.5*(omega3(i,j)+omega3(i,j+1))
         ENDIF
         uCoriolisTerm(i,j)= +vort3u*vBarXY*recip_dxC(i,j,bi,bj)
     &                              * maskW(i,j,k,bi,bj)
        ENDDO
       ENDDO
      ELSEIF ( selectVortScheme.EQ.2 ) THEN
       DO j=1-Oly,sNy+Oly-1
        DO i=2-Olx,sNx+Olx
         vBarXm=0.5*(
     &       vFld( i , j )*dxG( i , j ,bi,bj)*hFacS( i , j ,k,bi,bj)
     &      +vFld(i-1, j )*dxG(i-1, j ,bi,bj)*hFacS(i-1, j ,k,bi,bj) )
         vBarXp=0.5*(
     &       vFld( i ,j+1)*dxG( i ,j+1,bi,bj)*hFacS( i ,j+1,k,bi,bj)
     &      +vFld(i-1,j+1)*dxG(i-1,j+1,bi,bj)*hFacS(i-1,j+1,k,bi,bj) )
         IF (upwindVort3) THEN
          IF ( (vBarXm+vBarXp) .GT.0.) THEN
           vort3u=vBarXm*r_hFacZ(i, j )*omega3(i, j )
          ELSE
           vort3u=vBarXp*r_hFacZ(i,j+1)*omega3(i,j+1)
          ENDIF
         ELSE
           vort3u = ( vBarXm*r_hFacZ(i, j )*omega3(i, j )
     &               +vBarXp*r_hFacZ(i,j+1)*omega3(i,j+1)
     &              )*0.5d0
         ENDIF
         uCoriolisTerm(i,j)= +vort3u*recip_dxC(i,j,bi,bj)
     &                              * maskW(i,j,k,bi,bj)
        ENDDO
       ENDDO
      ELSEIF ( selectVortScheme.EQ.3 ) THEN
       DO j=1-Oly,sNy+Oly-1
        DO i=2-Olx,sNx+Olx-1
         vort3mj= ( r_hFacZ(i, j )*omega3(i, j )
     &            +(r_hFacZ(i,j+1)*omega3(i,j+1)
     &             +r_hFacZ(i-1,j)*omega3(i-1,j)
     &            ))*oneThird
     &      *vFld(i-1, j )*dxG(i-1, j ,bi,bj)*hFacS(i-1, j ,k,bi,bj)
         vort3ij= ( r_hFacZ(i, j )*omega3(i, j )
     &            +(r_hFacZ(i,j+1)*omega3(i,j+1)
     &             +r_hFacZ(i+1,j)*omega3(i+1,j)
     &            ))*oneThird
     &      *vFld( i , j )*dxG( i , j ,bi,bj)*hFacS( i , j ,k,bi,bj)
         vort3mp= ( r_hFacZ(i,j+1)*omega3(i,j+1)
     &            +(r_hFacZ(i, j )*omega3(i, j )
     &             +r_hFacZ(i-1,j+1)*omega3(i-1,j+1)
     &            ))*oneThird
     &      *vFld(i-1,j+1)*dxG(i-1,j+1,bi,bj)*hFacS(i-1,j+1,k,bi,bj)
         vort3ip= ( r_hFacZ(i,j+1)*omega3(i,j+1)
     &            +(r_hFacZ(i, j )*omega3(i, j )
     &             +r_hFacZ(i+1,j+1)*omega3(i+1,j+1)
     &            ))*oneThird
     &      *vFld( i ,j+1)*dxG( i ,j+1,bi,bj)*hFacS( i ,j+1,k,bi,bj)
         uCoriolisTerm(i,j)= +( (vort3mj+vort3ij)+(vort3mp+vort3ip) )
     &                     *0.25d0 *recip_dxC(i,j,bi,bj)
     &                                * maskW(i,j,k,bi,bj)
        ENDDO
       ENDDO
      ELSE
        WRITE(msgBuf,'(A,I5,A)')
     &   'MOM_VI_U_CORIOLIS: selectVortScheme=', selectVortScheme,
     &   ' not implemented'
        CALL PRINT_ERROR( msgBuf, myThid )
        STOP 'ABNORMAL END: S/R MOM_VI_U_CORIOLIS'
      ENDIF
      IF ( useJamartMomAdv ) THEN
       DO j=1-Oly,sNy+Oly-1
        DO i=2-Olx,sNx+Olx-1
         uCoriolisTerm(i,j) = uCoriolisTerm(i,j)
     &           * 4.d0 * hFacW(i,j,k,bi,bj)
     &           / MAX( epsil,
     &                  (hFacS(i, j ,k,bi,bj)+hFacS(i-1, j ,k,bi,bj))
     &                 +(hFacS(i,j+1,k,bi,bj)+hFacS(i-1,j+1,k,bi,bj))
     &                )
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_VI_U_CORIOLIS_C4(
     I        bi,bj,k,
     I        vFld,omega3,r_hFacZ,
     O        uCoriolisTerm,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 omega3(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 r_hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uCoriolisTerm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      INTEGER i,j
      Real*8 vort3r(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vBarXY,vort3u,Rjp,Rjm
      Real*8 vBarXm,vBarXp
      LOGICAL northWestCorner, northEastCorner,
     &        southWestCorner, southEastCorner
      INTEGER myFace
      Real*8 oneSixth, oneTwelve
      LOGICAL fourthVort3
      PARAMETER(oneSixth=1.d0/6.d0 , oneTwelve=1.d0/12.d0)
      PARAMETER(fourthVort3=.TRUE. )
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
         vort3r(i,j) = r_hFacZ(i,j)*omega3(i,j)
       ENDDO
      ENDDO
      IF ( useCubedSphereExchange.AND.highOrderVorticity ) THEN
       myFace = bi
       southWestCorner = .TRUE.
       southEastCorner = .TRUE.
       northWestCorner = .TRUE.
       northEastCorner = .TRUE.
       IF ( southWestCorner ) THEN
         i = 1
         j = 1
         vort3r(i,j-1) = ( vort3r(i,j-1) + vort3r(i+1,j) )*0.5d0
       ENDIF
       IF ( southEastCorner ) THEN
         i = sNx+1
         j = 1
         vort3r(i,j-1) = ( vort3r(i,j-1) + vort3r(i-1,j) )*0.5d0
       ENDIF
       IF ( northWestCorner ) THEN
         i = 1
         j = sNy+1
         vort3r(i,j+1) = ( vort3r(i,j+1) + vort3r(i+1,j) )*0.5d0
       ENDIF
       IF ( northEastCorner ) THEN
         i = sNx+1
         j = sNy+1
         vort3r(i,j+1) = ( vort3r(i,j+1) + vort3r(i-1,j) )*0.5d0
       ENDIF
      ENDIF
      IF ( selectVortScheme.EQ.0 ) THEN
       DO j=1,sNy
        DO i=1,sNx+1
         vBarXY=0.25*(
     &      (vFld( i , j )*dxG( i , j ,bi,bj)*hFacS( i , j ,k,bi,bj)
     &      +vFld(i-1, j )*dxG(i-1, j ,bi,bj)*hFacS(i-1, j ,k,bi,bj))
     &     +(vFld( i ,j+1)*dxG( i ,j+1,bi,bj)*hFacS( i ,j+1,k,bi,bj)
     &      +vFld(i-1,j+1)*dxG(i-1,j+1,bi,bj)*hFacS(i-1,j+1,k,bi,bj))
     &               )
         IF (upwindVorticity) THEN
          IF (vBarXY.GT.0.) THEN
           vort3u=vort3r(i,j)
          ELSE
           vort3u=vort3r(i,j+1)
          ENDIF
         ELSEIF (fourthVort3) THEN
          Rjp = vort3r(i,j+2) - vort3r(i,j+1)
          Rjm = vort3r(i, j ) - vort3r(i,j-1)
          vort3u=0.5*( vort3r(i,j) + vort3r(i,j+1)
     &                -oneTwelve*(Rjp-Rjm)
     &               )
         ELSE
          vort3u=0.5*( vort3r(i,j) + vort3r(i,j+1) )
         ENDIF
         uCoriolisTerm(i,j) =  vort3u*vBarXY*recip_dxC(i,j,bi,bj)
     &                               * maskW(i,j,k,bi,bj)
        ENDDO
       ENDDO
      ELSEIF ( selectVortScheme.EQ.2 ) THEN
       DO j=1,sNy
        DO i=1,sNx+1
         vBarXm=0.5*(
     &       vFld( i , j )*dxG( i , j ,bi,bj)*hFacS( i , j ,k,bi,bj)
     &      +vFld(i-1, j )*dxG(i-1, j ,bi,bj)*hFacS(i-1, j ,k,bi,bj) )
         vBarXp=0.5*(
     &       vFld( i ,j+1)*dxG( i ,j+1,bi,bj)*hFacS( i ,j+1,k,bi,bj)
     &      +vFld(i-1,j+1)*dxG(i-1,j+1,bi,bj)*hFacS(i-1,j+1,k,bi,bj) )
         IF (upwindVorticity) THEN
          IF ( (vBarXm+vBarXp) .GT.0.) THEN
           vort3u=vBarXm*vort3r(i, j )
          ELSE
           vort3u=vBarXp*vort3r(i,j+1)
          ENDIF
         ELSEIF (fourthVort3) THEN
          Rjp = vort3r(i,j+1) -oneSixth*( vort3r(i,j+2)-vort3r(i, j ) )
          Rjm = vort3r(i, j ) +oneSixth*( vort3r(i,j+1)-vort3r(i,j-1) )
          vort3u=0.5*( vBarXm*Rjm + vBarXp*Rjp )
         ELSE
          vort3u=0.5*( vBarXm*vort3r(i, j ) + vBarXp*vort3r(i,j+1) )
         ENDIF
         uCoriolisTerm(i,j) =  vort3u*recip_dxC(i,j,bi,bj)
     &                               * maskW(i,j,k,bi,bj)
        ENDDO
       ENDDO
      ELSE
        WRITE(msgBuf,'(A,I5,A)')
     &   'MOM_VI_U_CORIOLIS_C4: selectVortScheme=', selectVortScheme,
     &   ' not implemented'
        CALL PRINT_ERROR( msgBuf, myThid )
        STOP 'ABNORMAL END: S/R MOM_VI_U_CORIOLIS_C4'
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_VI_U_GRAD_KE( 
     I        bi,bj,K,
     I        KE,
     O        dKEdx,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,K
      Real*8 KE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 dKEdx(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      INTEGER I,J
       DO J=1-Oly,sNy+Oly
        DO I=2-Olx,sNx+Olx
         dKEdx(I,J)=-recip_dxC(i,j,bi,bj)*(KE(i,j)-KE(i-1,j))
     &       *maskW(i,j,k,BI,BJ)
        ENDDO
       ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_VI_U_VERTSHEAR(
     I        bi,bj,K,
     I        uFld,wFld,
     U        uShearTerm,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER bi,bj,K
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 wFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 uShearTerm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      INTEGER I,J,Kp1,Km1
      Real*8  mask_Kp1,mask_Km1,wBarXm,wBarXp
      Real*8  uZm,uZp
      LOGICAL  rAdvAreaWeight
c1    Real*8  wBarXZ,uZbarZ
      rAdvAreaWeight =.TRUE.
      IF ( selectKEscheme.EQ.1 .OR. selectKEscheme.EQ.3 )
     &  rAdvAreaWeight =.FALSE.
      Kp1=min(K+1,Nr)
      mask_Kp1=1.
      IF (K.EQ.Nr) mask_Kp1=0.
      Km1=max(K-1,1)
      mask_Km1=1.
      IF (K.EQ.1) mask_Km1=0.
      DO J=1-Oly,sNy+Oly
       DO I=2-Olx,sNx+Olx
       IF ( rAdvAreaWeight ) THEN
        wBarXm=0.5*(
     &    wFld(I,J,K,bi,bj)*rA(i,j,bi,bj)*maskC(I,J,Km1,bi,bj)
     &   +wFld(I-1,J,K,bi,bj)*rA(i-1,j,bi,bj)*maskC(I-1,J,Km1,bi,bj)
     &             )*mask_Km1
     &              *recip_rAw(i,j,bi,bj)
        wBarXp=0.5*(
     &    wFld(I,J,Kp1,bi,bj)*rA(i,j,bi,bj)
     &   +wFld(I-1,J,Kp1,bi,bj)*rA(i-1,j,bi,bj)
     &             )*mask_Kp1
     &              *recip_rAw(i,j,bi,bj)
       ELSE
        wBarXm=0.5*(
     &    wFld(I,J,K,bi,bj)*maskC(I,J,Km1,bi,bj)
     &   +wFld(I-1,J,K,bi,bj)*maskC(I-1,J,Km1,bi,bj)
     &             )*mask_Km1
        wBarXp=0.5*(
     &    wFld(I,J,Kp1,bi,bj)
     &   +wFld(I-1,J,Kp1,bi,bj)
     &             )*mask_Kp1
       ENDIF
        uZm=(uFld(I,J,K,bi,bj)-mask_Km1*uFld(I,J,Km1,bi,bj))*rkSign
c2   &      *recip_dRC(K)
        uZp=(mask_Kp1*uFld(I,J,Kp1,bi,bj)-uFld(I,J,K,bi,bj))*rkSign
c2   &      *recip_dRC(Kp1)
c1      IF (upwindShear) THEN
c1       wBarXZ=0.5*( wBarXm + wBarXp )
c1       IF (wBarXZ.GT.0.) THEN
c1        uZbarZ=uZp
c1       ELSE
c1        uZbarZ=uZm
c1       ENDIF
c1      ELSE
c1       uZbarZ=0.5*(uZm+uZp)
c1      ENDIF
c1      uShearTerm(I,J)=-wBarXZ*uZbarZ*maskW(I,J,K,bi,bj)
c2      uShearTerm(I,J)=-0.5*(wBarXp*uZp+wBarXm*uZm)
c2   &                  *maskW(I,J,K,bi,bj)
        IF (upwindShear) THEN
          uShearTerm(I,J)=-0.5*
     &                   (     (wBarXp*uZp+wBarXm*uZm)
     &                        +(ABS(wBarXp)*uZp-ABS(wBarXm)*uZm)
     &                   )*recip_hFacW(i,j,k,bi,bj)
     &                    * recip_drF(K)
c3   &                    * recip_rAw(i,j,bi,bj)
        ELSE
          uShearTerm(I,J)=-0.5*(wBarXp*uZp+wBarXm*uZm)
     &                    *recip_hFacW(i,j,k,bi,bj)
     &                    * recip_drF(K)
c3   &                    * recip_rAw(i,j,bi,bj)
        ENDIF
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_VI_V_CORIOLIS(
     I                     bi, bj, k,
     I                     uFld, omega3, hFacZ, r_hFacZ,
     O                     vCoriolisTerm,
     I                     myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER bi, bj, k
      Real*8     uFld     (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8     omega3   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8     hFacZ    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8     r_hFacZ  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vCoriolisTerm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      LOGICAL upwindVort3
      INTEGER i, j
      Real*8     uBarXY, uBarYm, uBarYp
      Real*8     vort3v
      Real*8     vort3im, vort3ij, vort3pm, vort3pj
      Real*8     oneThird, tmpFac
      Real*8     epsil
      PARAMETER( upwindVort3 = .FALSE. )
      epsil = 1.D-9
      tmpFac = 1.d0
      oneThird = 1.d0 / 3.d0
      IF ( selectVortScheme.EQ.0 ) THEN
       DO j=2-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx-1
         uBarXY=0.25*(
     &      (uFld( i , j )*dyG( i , j ,bi,bj)*hFacW( i , j ,k,bi,bj)
     &      +uFld( i ,j-1)*dyG( i ,j-1,bi,bj)*hFacW( i ,j-1,k,bi,bj))
     &     +(uFld(i+1, j )*dyG(i+1, j ,bi,bj)*hFacW(i+1, j ,k,bi,bj)
     &      +uFld(i+1,j-1)*dyG(i+1,j-1,bi,bj)*hFacW(i+1,j-1,k,bi,bj))
     &               )
         IF (upwindVort3) THEN
          IF (uBarXY.GT.0.) THEN
           vort3v=omega3(i,j)*r_hFacZ(i,j)
          ELSE
           vort3v=omega3(i+1,j)*r_hFacZ(i+1,j)
          ENDIF
         ELSE
           vort3v=0.5*(omega3(i,j)*r_hFacZ(i,j)
     &                +omega3(i+1,j)*r_hFacZ(i+1,j))
         ENDIF
         vCoriolisTerm(i,j)= -vort3v*uBarXY*recip_dyC(i,j,bi,bj)
     &                              * maskS(i,j,k,bi,bj)
        ENDDO
       ENDDO
      ELSEIF ( selectVortScheme.EQ.1 ) THEN
       DO j=2-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx-1
         uBarXY= 0.5*(
     &      (uFld( i , j )*dyG( i , j ,bi,bj)*hFacZ( i ,j)
     &      +uFld( i ,j-1)*dyG( i ,j-1,bi,bj)*hFacZ( i ,j))
     &     +(uFld(i+1, j )*dyG(i+1, j ,bi,bj)*hFacZ(i+1,j)
     &      +uFld(i+1,j-1)*dyG(i+1,j-1,bi,bj)*hFacZ(i+1,j))
     &               )/MAX( epsil, hFacZ(i,j)+hFacZ(i+1,j) )
         IF (upwindVort3) THEN
          IF (uBarXY.GT.0.) THEN
           vort3v=omega3(i,j)
          ELSE
           vort3v=omega3(i+1,j)
          ENDIF
         ELSE
           vort3v=0.5*(omega3(i,j)+omega3(i+1,j))
         ENDIF
         vCoriolisTerm(i,j)= -vort3v*uBarXY*recip_dyC(i,j,bi,bj)
     &                              * maskS(i,j,k,bi,bj)
        ENDDO
       ENDDO
      ELSEIF ( selectVortScheme.EQ.2 ) THEN
       DO j=2-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx-1
         uBarYm=0.5*(
     &       uFld( i , j )*dyG( i , j ,bi,bj)*hFacW( i , j ,k,bi,bj)
     &      +uFld( i ,j-1)*dyG( i ,j-1,bi,bj)*hFacW( i ,j-1,k,bi,bj) )
         uBarYp=0.5*(
     &       uFld(i+1, j )*dyG(i+1, j ,bi,bj)*hFacW(i+1, j ,k,bi,bj)
     &      +uFld(i+1,j-1)*dyG(i+1,j-1,bi,bj)*hFacW(i+1,j-1,k,bi,bj) )
         IF (upwindVort3) THEN
          IF ( (uBarYm+uBarYp) .GT.0.) THEN
           vort3v=uBarYm*r_hFacZ( i ,j)*omega3( i ,j)
          ELSE
           vort3v=uBarYp*r_hFacZ(i+1,j)*omega3(i+1,j)
          ENDIF
         ELSE
           vort3v = ( uBarYm*r_hFacZ( i ,j)*omega3( i ,j)
     &               +uBarYp*r_hFacZ(i+1,j)*omega3(i+1,j)
     &              )*0.5d0
         ENDIF
         vCoriolisTerm(i,j)= -vort3v*recip_dyC(i,j,bi,bj)
     &                              * maskS(i,j,k,bi,bj)
        ENDDO
       ENDDO
      ELSEIF ( selectVortScheme.EQ.3 ) THEN
       DO j=2-Oly,sNy+Oly-1
        DO i=1-Olx,sNx+Olx-1
         vort3im= ( r_hFacZ(i, j )*omega3(i, j )
     &            +(r_hFacZ(i+1,j)*omega3(i+1,j)
     &             +r_hFacZ(i,j-1)*omega3(i,j-1)
     &            ))*oneThird
     &      *uFld( i ,j-1)*dyG( i ,j-1,bi,bj)*hFacW( i ,j-1,k,bi,bj)
         vort3ij= ( r_hFacZ(i, j )*omega3(i, j )
     &            +(r_hFacZ(i+1,j)*omega3(i+1,j)
     &             +r_hFacZ(i,j+1)*omega3(i,j+1)
     &            ))*oneThird
     &      *uFld( i , j )*dyG( i , j ,bi,bj)*hFacW( i , j ,k,bi,bj)
         vort3pm= ( r_hFacZ(i+1,j)*omega3(i+1,j)
     &            +(r_hFacZ(i, j )*omega3(i, j )
     &             +r_hFacZ(i+1,j-1)*omega3(i+1,j-1)
     &            ))*oneThird
     &      *uFld(i+1,j-1)*dyG(i+1,j-1,bi,bj)*hFacW(i+1,j-1,k,bi,bj)
         vort3pj= ( r_hFacZ(i+1,j)*omega3(i+1,j)
     &            +(r_hFacZ(i, j )*omega3(i, j )
     &             +r_hFacZ(i+1,j+1)*omega3(i+1,j+1)
     &            ))*oneThird
     &      *uFld(i+1, j )*dyG(i+1, j ,bi,bj)*hFacW(i+1, j ,k,bi,bj)
         vCoriolisTerm(i,j)= -( (vort3im+vort3ij)+(vort3pm+vort3pj) )
     &                     *0.25d0 *recip_dyC(i,j,bi,bj)
     &                                * maskS(i,j,k,bi,bj)
        ENDDO
       ENDDO
      ELSE
        WRITE(msgBuf,'(A,I5,A)')
     &   'MOM_VI_V_CORIOLIS: selectVortScheme=', selectVortScheme,
     &   ' not implemented'
        CALL PRINT_ERROR( msgBuf, myThid )
        STOP 'ABNORMAL END: S/R MOM_VI_V_CORIOLIS'
      ENDIF
      IF ( useJamartMomAdv ) THEN
       DO j=2-Oly,sNy+Oly-1
        DO i=1-Olx,sNx+Olx-1
         vCoriolisTerm(i,j) = vCoriolisTerm(i,j)
     &           * 4.d0 * hFacS(i,j,k,bi,bj)
     &           / MAX( epsil,
     &                  (hFacW( i ,j,k,bi,bj)+hFacW( i ,j-1,k,bi,bj))
     &                 +(hFacW(i+1,j,k,bi,bj)+hFacW(i+1,j-1,k,bi,bj))
     &                )
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_VI_V_CORIOLIS_C4(
     I        bi,bj,k,
     I        uFld,omega3,r_hFacZ,
     O        vCoriolisTerm,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 omega3(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 r_hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vCoriolisTerm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      INTEGER i,j
      Real*8 vort3r(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uBarXY,vort3v,Rjp,Rjm
      Real*8 uBarYm,uBarYp
      LOGICAL northWestCorner, northEastCorner,
     &        southWestCorner, southEastCorner
      INTEGER myFace
      Real*8 oneSixth, oneTwelve
      LOGICAL fourthVort3
      PARAMETER(oneSixth=1.d0/6.d0 , oneTwelve=1.d0/12.d0)
      PARAMETER(fourthVort3=.TRUE. )
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
         vort3r(i,j) = r_hFacZ(i,j)*omega3(i,j)
       ENDDO
      ENDDO
      IF ( useCubedSphereExchange.AND.highOrderVorticity ) THEN
       myFace = bi
       southWestCorner = .TRUE.
       southEastCorner = .TRUE.
       northWestCorner = .TRUE.
       northEastCorner = .TRUE.
       IF ( southWestCorner ) THEN
         i = 1
         j = 1
         vort3r(i-1,j) = ( vort3r(i-1,j) + vort3r(i,j+1) )*0.5d0
       ENDIF
       IF ( southEastCorner ) THEN
         i = sNx+1
         j = 1
         vort3r(i+1,j) = ( vort3r(i+1,j) + vort3r(i,j+1) )*0.5d0
       ENDIF
       IF ( northWestCorner ) THEN
         i = 1
         j = sNy+1
         vort3r(i-1,j) = ( vort3r(i-1,j) + vort3r(i,j-1) )*0.5d0
       ENDIF
       IF ( northEastCorner ) THEN
         i = sNx+1
         j = sNy+1
         vort3r(i+1,j) = ( vort3r(i+1,j) + vort3r(i,j-1) )*0.5d0
       ENDIF
      ENDIF
      IF ( selectVortScheme.EQ.0 ) THEN
       DO j=1,sNy+1
        DO i=1,sNx
         uBarXY=0.25*(
     &      (uFld( i , j )*dyG( i , j ,bi,bj)*hFacW( i , j ,k,bi,bj)
     &      +uFld( i ,j-1)*dyG( i ,j-1,bi,bj)*hFacW( i ,j-1,k,bi,bj))
     &     +(uFld(i+1, j )*dyG(i+1, j ,bi,bj)*hFacW(i+1, j ,k,bi,bj)
     &      +uFld(i+1,j-1)*dyG(i+1,j-1,bi,bj)*hFacW(i+1,j-1,k,bi,bj))
     &               )
         IF (upwindVorticity) THEN
          IF (uBarXY.GT.0.) THEN
           vort3v=vort3r(i,j)
          ELSE
           vort3v=vort3r(i+1,j)
          ENDIF
         ELSEIF (fourthVort3) THEN
          Rjp = vort3r(i+2,j) - vort3r(i+1,j)
          Rjm = vort3r( i ,j) - vort3r(i-1,j)
          vort3v=0.5*( vort3r(i,j) + vort3r(i+1,j)
     &                -oneTwelve*(Rjp-Rjm)
     &               )
         ELSE
          vort3v=0.5*( vort3r(i,j) + vort3r(i+1,j) )
         ENDIF
         vCoriolisTerm(i,j) = -vort3v*uBarXY*recip_dyC(i,j,bi,bj)
     &                               * maskS(i,j,k,bi,bj)
        ENDDO
       ENDDO
      ELSEIF ( selectVortScheme.EQ.2 ) THEN
       DO j=1,sNy+1
        DO i=1,sNx
         uBarYm=0.5*(
     &       uFld( i , j )*dyG( i , j ,bi,bj)*hFacW( i , j ,k,bi,bj)
     &      +uFld( i ,j-1)*dyG( i ,j-1,bi,bj)*hFacW( i ,j-1,k,bi,bj) )
         uBarYp=0.5*(
     &       uFld(i+1, j )*dyG(i+1, j ,bi,bj)*hFacW(i+1, j ,k,bi,bj)
     &      +uFld(i+1,j-1)*dyG(i+1,j-1,bi,bj)*hFacW(i+1,j-1,k,bi,bj) )
         IF (upwindVorticity) THEN
          IF ( (uBarYm+uBarYp) .GT.0.) THEN
           vort3v=uBarYm*vort3r( i ,j)
          ELSE
           vort3v=uBarYp*vort3r(i+1,j)
          ENDIF
         ELSEIF (fourthVort3) THEN
          Rjp = vort3r(i+1,j) -oneSixth*( vort3r(i+2,j)-vort3r( i ,j) )
          Rjm = vort3r( i ,j) +oneSixth*( vort3r(i+1,j)-vort3r(i-1,j) )
          vort3v=0.5*( uBarYm*Rjm + uBarYp*Rjp )
         ELSE
          vort3v=0.5*( uBarYm*vort3r( i ,j) + uBarYp*vort3r(i+1,j) )
         ENDIF
         vCoriolisTerm(i,j) = -vort3v*recip_dyC(i,j,bi,bj)
     &                               * maskS(i,j,k,bi,bj)
        ENDDO
       ENDDO
      ELSE
        WRITE(msgBuf,'(A,I5,A)')
     &   'MOM_VI_V_CORIOLIS_C4: selectVortScheme=', selectVortScheme,
     &   ' not implemented'
        CALL PRINT_ERROR( msgBuf, myThid )
        STOP 'ABNORMAL END: S/R MOM_VI_V_CORIOLIS_C4'
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_VI_V_GRAD_KE( 
     I        bi,bj,K,
     I        KE,
     O        dKEdy,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,K
      Real*8 KE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 dKEdy(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      INTEGER I,J
       DO J=2-Oly,sNy+Oly
        DO I=1-Olx,sNx+Olx
         dKEdy(I,J)=-recip_dyC(i,j,bi,bj)*(KE(i,j)-KE(i,j-1))
     &       *maskS(i,j,k,BI,BJ)
        ENDDO
       ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOM_VI_V_VERTSHEAR(
     I        bi,bj,K,
     I        vFld,wFld,
     U        vShearTerm,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER bi,bj,K
      Real*8 vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 wFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 vShearTerm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      INTEGER I,J,Kp1,Km1
      Real*8 mask_Kp1,mask_Km1,wBarYm,wBarYp
      Real*8 vZm,vZp
      LOGICAL  rAdvAreaWeight
c1    Real*8 wBarYZ,vZbarZ
      rAdvAreaWeight =.TRUE.
      IF ( selectKEscheme.EQ.1 .OR. selectKEscheme.EQ.3 )
     &  rAdvAreaWeight =.FALSE.
      Kp1=min(K+1,Nr)
      mask_Kp1=1.
      IF (K.EQ.Nr) mask_Kp1=0.
      Km1=max(K-1,1)
      mask_Km1=1.
      IF (K.EQ.1) mask_Km1=0.
      DO J=2-Oly,sNy+Oly
       DO I=1-Olx,sNx+Olx
       IF ( rAdvAreaWeight ) THEN
        wBarYm=0.5*(
     &    wFld(I,J,K,bi,bj)*rA(i,j,bi,bj)*maskC(i,j,Km1,bi,bj)
     &   +wFld(I,J-1,K,bi,bj)*rA(i,j-1,bi,bj)*maskC(i,j-1,Km1,bi,bj)
     &             )*mask_Km1
     &              *recip_rAs(i,j,bi,bj)
        wBarYp=0.5*(
     &    wFld(I,J,Kp1,bi,bj)*rA(i,j,bi,bj)
     &   +wFld(I,J-1,Kp1,bi,bj)*rA(i,j-1,bi,bj)
     &             )*mask_Kp1
     &              *recip_rAs(i,j,bi,bj)
       ELSE
        wBarYm=0.5*(
     &    wFld(I,J,K,bi,bj)*maskC(i,j,Km1,bi,bj)
     &   +wFld(I,J-1,K,bi,bj)*maskC(i,j-1,Km1,bi,bj)
     &             )*mask_Km1
        wBarYp=0.5*(
     &    wFld(I,J,Kp1,bi,bj)
     &   +wFld(I,J-1,Kp1,bi,bj)
     &             )*mask_Kp1
       ENDIF
        vZm=(vFld(I,J,K,bi,bj)-mask_Km1*vFld(I,J,Km1,bi,bj))*rkSign
c2   &      *recip_dRC(K)
        vZp=(mask_Kp1*vFld(I,J,Kp1,bi,bj)-vFld(I,J,K,bi,bj))*rkSign
c2   &      *recip_dRC(Kp1)
c1      IF (upwindShear) THEN
c1       wBarYZ=0.5*( wBarXm + wBarXp )
c1       IF (wBarYZ.GT.0.) THEN
c1        vZbarZ=vZp
c1       ELSE
c1        vZbarZ=vZm
c1       ENDIF
c1      ELSE
c1       vZbarZ=0.5*(vZm+vZp)
c1      ENDIF
c1      vShearTerm(I,J)=-wBarYZ*vZbarZ*maskS(I,J,K,bi,bj)
c2      vShearTerm(I,J)=-0.5*(wBarYp*vZp+wBarYm*vZm)
c2   &                  *maskS(I,J,K,bi,bj)
        IF (upwindShear) THEN
          vShearTerm(I,J)=-0.5*
     &                   (     (wBarYp*vZp+wBarYm*vZm)
     &                        +(ABS(wBarYp)*vZp-ABS(wBarYm)*vZm)
     &                   )*recip_hFacS(i,j,k,bi,bj)
     &                    * recip_drF(K)
c3   &                    * recip_rAs(i,j,bi,bj)
        ELSE
          vShearTerm(I,J)=-0.5*(wBarYp*vZp+wBarYm*vZm)
     &                    *recip_hFacS(i,j,k,bi,bj)
     &                    * recip_drF(K)
c3   &                    * recip_rAs(i,j,bi,bj)
        ENDIF
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE READ_FLD_XYZ_RS( pref,suff,field,myIter,myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      CHARACTER*(*) pref,suff
      Real*8 field(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      INTEGER myIter
      INTEGER myThid
      INTEGER ILNBLNK,IFNBLNK
      LOGICAL useCurrentDir
      Real*8 dummyRL(1)
      CHARACTER*(2) fType
      INTEGER nNz
      INTEGER iRec
      INTEGER s1Lo,s1Hi,s2Lo,s2Hi
      CHARACTER*(MAX_LEN_FNAM) fullName
C
      s1Lo = IFNBLNK(pref)
      s1Hi = ILNBLNK(pref)
      IF ( suff .EQ. ' ' ) THEN
       WRITE( fullName, '(A)' ) pref(s1Lo:s1Hi)
      ELSE
       s2Lo = IFNBLNK(suff)
       s2Hi = ILNBLNK(suff)
       WRITE( fullName, '(A,A)' ) pref(s1Lo:s1Hi),suff(s2Lo:s2Hi)
      ENDIF
      useCurrentDir = .FALSE.
      fType='RS'
      nNz=Nr
      iRec=1
      CALL MDS_READ_FIELD(
     I                     fullName, readBinaryPrec, useCurrentDir,
     I                     fType, nNz, 1, nNz,
     O                     dummyRL, field,
     I                     iRec, myThid )
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE READ_FLD_XYZ_RL( pref,suff,field,myIter,myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      CHARACTER*(*) pref,suff
      Real*8 field(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      INTEGER myIter
      INTEGER myThid
      INTEGER ILNBLNK,IFNBLNK
      LOGICAL useCurrentDir
      Real*8 dummyRS(1)
      CHARACTER*(2) fType
      INTEGER nNz
      INTEGER iRec
      INTEGER s1Lo,s1Hi,s2Lo,s2Hi
      CHARACTER*(MAX_LEN_FNAM) fullName
C
      s1Lo = IFNBLNK(pref)
      s1Hi = ILNBLNK(pref)
      IF ( suff .EQ. ' ' ) THEN
       WRITE( fullName, '(A)' ) pref(s1Lo:s1Hi)
      ELSE
       s2Lo = IFNBLNK(suff)
       s2Hi = ILNBLNK(suff)
       WRITE( fullName, '(A,A)' ) pref(s1Lo:s1Hi),suff(s2Lo:s2Hi)
      ENDIF
      useCurrentDir = .FALSE.
      fType='RL'
      nNz=Nr
      iRec=1
      CALL MDS_READ_FIELD(
     I                     fullName, readBinaryPrec, useCurrentDir,
     I                     fType, nNz, 1, nNz,
     O                     field, dummyRS,
     I                     iRec, myThid )
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE READ_FLD_XY_RS( pref,suff,field,myIter,myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      CHARACTER*(*) pref,suff
      Real*8 field(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      INTEGER myIter
      INTEGER myThid
      INTEGER ILNBLNK,IFNBLNK
      LOGICAL useCurrentDir
      Real*8 dummyRL(1)
      CHARACTER*(2) fType
      INTEGER nNz
      INTEGER iRec
      INTEGER s1Lo,s1Hi,s2Lo,s2Hi
      CHARACTER*(MAX_LEN_FNAM) fullName
C
      s1Lo = IFNBLNK(pref)
      s1Hi = ILNBLNK(pref)
      IF ( suff .EQ. ' ' ) THEN
       WRITE( fullName, '(A)' ) pref(s1Lo:s1Hi)
      ELSE
       s2Lo = IFNBLNK(suff)
       s2Hi = ILNBLNK(suff)
       WRITE( fullName, '(A,A)' ) pref(s1Lo:s1Hi),suff(s2Lo:s2Hi)
      ENDIF
      useCurrentDir = .FALSE.
      fType='RS'
      nNz=1
      iRec=1
      CALL MDS_READ_FIELD(
     I                     fullName, readBinaryPrec, useCurrentDir,
     I                     fType, nNz, 1, nNz,
     O                     dummyRL, field,
     I                     iRec, myThid )
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE READ_FLD_XY_RL( pref,suff,field,myIter,myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      CHARACTER*(*) pref,suff
      Real*8 field(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      INTEGER myIter
      INTEGER myThid
      INTEGER ILNBLNK,IFNBLNK
      LOGICAL useCurrentDir
      Real*8 dummyRS(1)
      CHARACTER*(2) fType
      INTEGER nNz
      INTEGER iRec
      INTEGER s1Lo,s1Hi,s2Lo,s2Hi
      CHARACTER*(MAX_LEN_FNAM) fullName
C
      s1Lo = IFNBLNK(pref)
      s1Hi = ILNBLNK(pref)
      IF ( suff .EQ. ' ' ) THEN
       WRITE( fullName, '(A)' ) pref(s1Lo:s1Hi)
      ELSE
       s2Lo = IFNBLNK(suff)
       s2Hi = ILNBLNK(suff)
       WRITE( fullName, '(A,A)' ) pref(s1Lo:s1Hi),suff(s2Lo:s2Hi)
      ENDIF
      useCurrentDir = .FALSE.
      fType='RL'
      nNz=1
      iRec=1
      CALL MDS_READ_FIELD(
     I                     fullName, readBinaryPrec, useCurrentDir,
     I                     fType, nNz, 1, nNz,
     O                     field, dummyRS,
     I                     iRec, myThid )
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE READ_REC_XY_RS( fName,field,iRec,myIter,myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      CHARACTER*(*) fName
      Real*8 field(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      INTEGER iRec
      INTEGER myIter
      INTEGER myThid
      LOGICAL useCurrentDir
      Real*8 dummyRL(1)
      CHARACTER*(2) fType
      INTEGER nNz
      useCurrentDir = .FALSE.
      fType='RS'
      nNz=1
      CALL MDS_READ_FIELD(
     I                     fName, readBinaryPrec, useCurrentDir,
     I                     fType, nNz, 1, nNz,
     O                     dummyRL, field,
     I                     iRec, myThid )
      RETURN
      END
      SUBROUTINE READ_REC_XY_RL( fName,field,iRec,myIter,myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      CHARACTER*(*) fName
      Real*8 field(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      INTEGER iRec
      INTEGER myIter
      INTEGER myThid
      LOGICAL useCurrentDir
      Real*8 dummyRS(1)
      CHARACTER*(2) fType
      INTEGER nNz
      useCurrentDir = .FALSE.
      fType='RL'
      nNz=1
      CALL MDS_READ_FIELD(
     I                     fName, readBinaryPrec, useCurrentDir,
     I                     fType, nNz, 1, nNz,
     O                     field, dummyRS,
     I                     iRec, myThid )
      RETURN
      END
      SUBROUTINE READ_REC_XYZ_RS( fName,field,iRec,myIter,myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      CHARACTER*(*) fName
      Real*8 field(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      INTEGER iRec
      INTEGER myIter
      INTEGER myThid
      LOGICAL useCurrentDir
      Real*8 dummyRL(1)
      CHARACTER*(2) fType
      INTEGER nNz
      useCurrentDir = .FALSE.
      fType='RS'
      nNz=Nr
      CALL MDS_READ_FIELD(
     I                     fName, readBinaryPrec, useCurrentDir,
     I                     fType, nNz, 1, nNz,
     O                     dummyRL, field,
     I                     iRec, myThid )
      RETURN
      END
      SUBROUTINE READ_REC_XYZ_RL( fName,field,iRec,myIter,myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      CHARACTER*(*) fName
      Real*8 field(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      INTEGER iRec
      INTEGER myIter
      INTEGER myThid
      LOGICAL useCurrentDir
      Real*8 dummyRS(1)
      CHARACTER*(2) fType
      INTEGER nNz
      useCurrentDir = .FALSE.
      fType='RL'
      nNz=Nr
      CALL MDS_READ_FIELD(
     I                     fName, readBinaryPrec, useCurrentDir,
     I                     fType, nNz, 1, nNz,
     O                     field, dummyRS,
     I                     iRec, myThid )
      RETURN
      END
      SUBROUTINE READ_REC_3D_RS(
     I                           fName, fPrec, nNz,
     O                           field,
     I                           iRec, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      CHARACTER*(*) fName
      INTEGER fPrec
      INTEGER nNz
      Real*8 field(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nNz,nSx,nSy)
      INTEGER iRec
      INTEGER myIter
      INTEGER myThid
      LOGICAL useCurrentDir
      Real*8 dummyRL(1)
      CHARACTER*(2) fType
      useCurrentDir = .FALSE.
      fType='RS'
      CALL MDS_READ_FIELD(
     I                     fName, fPrec, useCurrentDir,
     I                     fType, nNz, 1, nNz,
     O                     dummyRL, field,
     I                     iRec, myThid )
      RETURN
      END
      SUBROUTINE READ_REC_3D_RL(
     I                           fName, fPrec, nNz,
     O                           field,
     I                           iRec, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      CHARACTER*(*) fName
      INTEGER fPrec
      INTEGER nNz
      Real*8 field(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nNz,nSx,nSy)
      INTEGER iRec
      INTEGER myIter
      INTEGER myThid
      LOGICAL useCurrentDir
      Real*8 dummyRS(1)
      CHARACTER*(2) fType
      useCurrentDir = .FALSE.
      fType='RL'
      CALL MDS_READ_FIELD(
     I                     fName, fPrec, useCurrentDir,
     I                     fType, nNz, 1, nNz,
     O                     field, dummyRS,
     I                     iRec, myThid )
      RETURN
      END
      SUBROUTINE READ_REC_LEV_RS(
     I                           fName, fPrec, kSiz, kLo, kHi,
     O                           field,
     I                           iRec, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      CHARACTER*(*) fName
      INTEGER fPrec
      INTEGER kSiz, kLo, kHi
      Real*8 field(1-Olx:sNx+Olx,1-Oly:sNy+Oly,kSiz,nSx,nSy)
      INTEGER iRec
      INTEGER myIter
      INTEGER myThid
      LOGICAL useCurrentDir
      Real*8 dummyRL(1)
      CHARACTER*(2) fType
      useCurrentDir = .FALSE.
      fType='RS'
      CALL MDS_READ_FIELD(
     I                     fName, fPrec, useCurrentDir,
     I                     fType, kSiz, kLo, kHi,
     O                     dummyRL, field,
     I                     iRec, myThid )
      RETURN
      END
      SUBROUTINE READ_REC_LEV_RL(
     I                           fName, fPrec, kSiz, kLo, kHi,
     O                           field,
     I                           iRec, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      CHARACTER*(*) fName
      INTEGER fPrec
      INTEGER kSiz, kLo, kHi
      Real*8 field(1-Olx:sNx+Olx,1-Oly:sNy+Oly,kSiz,nSx,nSy)
      INTEGER iRec
      INTEGER myIter
      INTEGER myThid
      LOGICAL useCurrentDir
      Real*8 dummyRS(1)
      CHARACTER*(2) fType
      useCurrentDir = .FALSE.
      fType='RL'
      CALL MDS_READ_FIELD(
     I                     fName, fPrec, useCurrentDir,
     I                     fType, kSiz, kLo, kHi,
     O                     field, dummyRS,
     I                     iRec, myThid )
      RETURN
      END
      SUBROUTINE READ_REC_XZ_RS(
     I                           fName, fPrec, nNz,
     O                           field,
     I                           iRec, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      CHARACTER*(*) fName
      INTEGER fPrec
      INTEGER nNz
      Real*8 field(1-Olx:sNx+Olx,nNz,nSx,nSy)
      INTEGER iRec
      INTEGER myIter
      INTEGER myThid
      LOGICAL useCurrentDir
      Real*8 dummyRL(1)
      CHARACTER*(2) fType
      useCurrentDir = .FALSE.
      fType='RS'
      CALL MDS_READ_SEC_XZ(
     I                      fName, fPrec, useCurrentDir,
     I                      fType, nNz,
     O                      dummyRL, field,
     I                      iRec, myThid )
      RETURN
      END
      SUBROUTINE READ_REC_XZ_RL(
     I                           fName, fPrec, nNz,
     O                           field,
     I                           iRec, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      CHARACTER*(*) fName
      INTEGER fPrec
      INTEGER nNz
      Real*8 field(1-Olx:sNx+Olx,nNz,nSx,nSy)
      INTEGER iRec
      INTEGER myIter
      INTEGER myThid
      LOGICAL useCurrentDir
      Real*8 dummyRS(1)
      CHARACTER*(2) fType
      useCurrentDir = .FALSE.
      fType='RL'
      CALL MDS_READ_SEC_XZ(
     I                      fName, fPrec, useCurrentDir,
     I                      fType, nNz,
     O                      field, dummyRS,
     I                      iRec, myThid )
      RETURN
      END
      SUBROUTINE READ_REC_YZ_RS(
     I                           fName, fPrec, nNz,
     O                           field,
     I                           iRec, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      CHARACTER*(*) fName
      INTEGER fPrec
      INTEGER nNz
      Real*8 field(1-Oly:sNy+Oly,nNz,nSx,nSy)
      INTEGER iRec
      INTEGER myIter
      INTEGER myThid
      LOGICAL useCurrentDir
      Real*8 dummyRL(1)
      CHARACTER*(2) fType
      useCurrentDir = .FALSE.
      fType='RS'
      CALL MDS_READ_SEC_YZ(
     I                      fName, fPrec, useCurrentDir,
     I                      fType, nNz,
     O                      dummyRL, field,
     I                      iRec, myThid )
      RETURN
      END
      SUBROUTINE READ_REC_YZ_RL(
     I                           fName, fPrec, nNz,
     O                           field,
     I                           iRec, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      CHARACTER*(*) fName
      INTEGER fPrec
      INTEGER nNz
      Real*8 field(1-Oly:sNy+Oly,nNz,nSx,nSy)
      INTEGER iRec
      INTEGER myIter
      INTEGER myThid
      LOGICAL useCurrentDir
      Real*8 dummyRS(1)
      CHARACTER*(2) fType
      useCurrentDir = .FALSE.
      fType='RL'
      CALL MDS_READ_SEC_YZ(
     I                      fName, fPrec, useCurrentDir,
     I                      fType, nNz,
     O                      field, dummyRS,
     I                      iRec, myThid )
      RETURN
      END
C
C
C
CStartofinterface
      SUBROUTINE TIMEAVE_CUMUL_1K1T( 
     O              fldtave, 
     I              fld, deltaTloc, 
     I              Ksize, k, bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER Ksize
      Real*8 fld    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 fldtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
      Real*8 deltaTloc
      INTEGER k, bi, bj, myThid
CEndofinterface
      INTEGER i, j
 
      DO j=1,sNy
        DO i=1,sNx
          fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj)
     &                         + fld(i,j)*deltaTloc
        ENDDO
      ENDDO
 
      RETURN
      END
C
C
C
CStartofinterface
      SUBROUTINE TIMEAVE_CUMUL_1T( 
     O              fldtave, 
     I              fld, Ksize, deltaTloc, 
     I              bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER Ksize
      Real*8 fld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize)
      Real*8 fldtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
      Real*8 deltaTloc
      INTEGER bi, bj, myThid
CEndofinterface
      INTEGER i, j, k
 
        DO k=1,Ksize
         DO j=1,sNy
          DO i=1,sNx
             fldtave(i,j,k,bi,bj)=
     &       fldtave(i,j,k,bi,bj)+fld(i,j,k)*deltaTloc
           ENDDO
          ENDDO
         ENDDO
 
      RETURN
      END
C
C
C
CStartofinterface
      SUBROUTINE TIMEAVE_CUMUL_1VFC( 
     O   fldtave,
     I   fld1, fld2, Ksize, deltaTloc,
     I   bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER Ksize
      Real*8 fld1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
      Real*8 fld2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
      Real*8 fldtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
      Real*8 deltaTloc
      INTEGER bi, bj, myThid
CEndofinterface
      INTEGER i, j, k
 
        DO k=1,Ksize
         DO j=1,sNy
          DO i=1,sNx
           fldtave(i,j,k,bi,bj)= fldtave(i,j,k,bi,bj)
     &       + deltaTloc*fld1(i,j,k,bi,bj)*fld2(i,j,k,bi,bj)
           ENDDO
          ENDDO
         ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
CStartofinterface
      SUBROUTINE TIMEAVE_CUMUL_2V( 
     O   fldtave,
     I   fld1, fld2, Ksize, dir, deltaTloc,
     I   bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER Ksize, dir
      Real*8 fld1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
      Real*8 fld2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
      Real*8 fldtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
      Real*8 deltaTloc
      INTEGER bi, bj, myThid
CEndofinterface
      INTEGER i, j, k
      INTEGER km1
 
      IF ( dir.eq.0 ) THEN 
        DO k=1,Ksize
         DO j=1,sNy
          DO i=1,sNx
             fldtave(i,j,k,bi,bj)= fldtave(i,j,k,bi,bj)
     &       +  fld1(i,j,k,bi,bj)*fld2(i,j,k,bi,bj)*deltaTloc
          ENDDO
         ENDDO
        ENDDO
      ELSEIF ( dir.eq.1 )  THEN
 
        DO k=1,Ksize
         DO j=1,sNy
          DO i=1,sNx
             fldtave(i,j,k,bi,bj)= fldtave(i,j,k,bi,bj)
     &       + .5 * ( fld1(i-1,j,k,bi,bj) + fld1(i,j,k,bi,bj) )
     &                *   fld2(i,j,k,bi,bj)
     &                *   deltaTloc
          ENDDO
         ENDDO
        ENDDO
      ELSEIF ( dir.eq.2 ) THEN
 
        DO k=1,Ksize
         DO j=1,sNy
          DO i=1,sNx
             fldtave(i,j,k,bi,bj)= fldtave(i,j,k,bi,bj)
     &       + .5 * ( fld1(i,j-1,k,bi,bj) + fld1(i,j,k,bi,bj) )
     &                *   fld2(i,j,k,bi,bj)
     &                *   deltaTloc
          ENDDO
         ENDDO
        ENDDO
      ELSEIF ( dir.eq.3 ) THEN
 
        DO k=1,Ksize
         km1 = MAX(k-1,1)
         DO j=1,sNy
          DO i=1,sNx
             fldtave(i,j,k,bi,bj)= fldtave(i,j,k,bi,bj)
     &       + .5 * ( fld1(i,j,km1,bi,bj) + fld1(i,j,k,bi,bj) )
     &                *   fld2(i,j,k,bi,bj)
     &                *   deltaTloc
          ENDDO
         ENDDO
        ENDDO
      ELSEIF ( dir.eq.12 ) THEN
 
        DO k=1,Ksize
         DO j=1,sNy
          DO i=1,sNx
           fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj)
     &      + .25d0*( fld1(i,j-1,k,bi,bj) + fld1(i,j,k,bi,bj) )
     &                *( fld2(i-1,j,k,bi,bj) + fld2(i,j,k,bi,bj) )
     &                * deltaTloc
          ENDDO
         ENDDO
        ENDDO
      ELSEIF ( dir.eq.13 ) THEN
 
        DO k=1,Ksize
         km1 = MAX(k-1,1)
         DO j=1,sNy
          DO i=1,sNx
           fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj)
     &      + .25d0*( fld1(i,j,km1,bi,bj) + fld1(i,j,k,bi,bj) )
     &                *( fld2(i-1,j,k,bi,bj)*rA(i-1,j,bi,bj)
     &                  +fld2( i ,j,k,bi,bj)*rA( i ,j,bi,bj)
     &                 )*recip_rAw(i,j,bi,bj)
     &                * deltaTloc
          ENDDO
         ENDDO
        ENDDO
      ELSEIF ( dir.eq.23 ) THEN
 
        DO k=1,Ksize
         km1 = MAX(k-1,1)
         DO j=1,sNy
          DO i=1,sNx
           fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj)
     &      + .25d0*( fld1(i,j,km1,bi,bj) + fld1(i,j,k,bi,bj) )
     &                *( fld2(i,j-1,k,bi,bj)*rA(i,j-1,bi,bj)
     &                  +fld2(i, j ,k,bi,bj)*rA(i, j ,bi,bj)
     &                 )*recip_rAs(i,j,bi,bj)
     &                * deltaTloc
          ENDDO
         ENDDO
        ENDDO
      ELSEIF ( dir.eq.-13 ) THEN
 
        DO k=2,Ksize
         DO j=1,sNy
          DO i=1,sNx
           fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj)
     &       + .5d0*( fld1(i,j,k-1,bi,bj) - fld1(i,j,k,bi,bj) )
     &                *( fld2(i-1,j,k,bi,bj)*rA(i-1,j,bi,bj)
     &                  +fld2( i ,j,k,bi,bj)*rA( i ,j,bi,bj)
     &                 )*recip_rAw(i,j,bi,bj)
     &                * deltaTloc
          ENDDO
         ENDDO
        ENDDO
      ELSEIF ( dir.eq.-23 ) THEN
 
        DO k=2,Ksize
         DO j=1,sNy
          DO i=1,sNx
           fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj)
     &       + .5d0*( fld1(i,j,k-1,bi,bj) - fld1(i,j,k,bi,bj) )
     &                *( fld2(i,j-1,k,bi,bj)*rA(i,j-1,bi,bj)
     &                  +fld2(i, j ,k,bi,bj)*rA(i, j ,bi,bj)
     &                 )*recip_rAs(i,j,bi,bj)
     &                * deltaTloc
          ENDDO
         ENDDO
        ENDDO
      ENDIF
      RETURN
      END
C
C
C
CStartofinterface
      SUBROUTINE TIMEAVE_CUMUL_2VFC( 
     O   fldtave,
     I   fld1, fld2, fld3, Ksize, dir, deltaTloc,
     I   bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER Ksize, dir
      Real*8 fld1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
      Real*8 fld2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
      Real*8 fld3(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
      Real*8 fldtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
      Real*8 deltaTloc
      INTEGER bi, bj, myThid
CEndofinterface
      INTEGER i, j, k
 
      IF ( dir.eq.0 ) THEN 
        DO k=1,Ksize
         DO j=1,sNy
          DO i=1,sNx
            fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj) + deltaTloc*
     &         fld1(i,j,k,bi,bj)*fld2(i,j,k,bi,bj)*fld3(i,j,k,bi,bj)
           ENDDO
          ENDDO
         ENDDO
      ELSEIF ( dir.eq.1 )  THEN
 
        DO k=1,Ksize
         DO j=1,sNy
          DO i=1,sNx
            fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj) + deltaTloc*
     &         0.5*( fld1(i-1,j,k,bi,bj) + fld1(i,j,k,bi,bj) )
     &            *fld2(i,j,k,bi,bj)*fld3(i,j,k,bi,bj)
           ENDDO
          ENDDO
         ENDDO
      ELSEIF ( dir.eq.2 ) THEN
 
        DO k=1,Ksize
         DO j=1,sNy
          DO i=1,sNx
            fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj) + deltaTloc*
     &         0.5*( fld1(i,j-1,k,bi,bj) + fld1(i,j,k,bi,bj) )
     &            *fld2(i,j,k,bi,bj)*fld3(i,j,k,bi,bj)
           ENDDO
          ENDDO
         ENDDO
      ENDIF
      RETURN
      END
C
C
C
CStartofinterface
      SUBROUTINE TIMEAVE_CUMULATE( 
     O              fldtave, 
     I              fld, Ksize, deltaTloc, 
     I              bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER Ksize
      Real*8 fld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
      Real*8 fldtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
      Real*8 deltaTloc
      INTEGER bi, bj, myThid
CEndofinterface
      INTEGER i, j, k
 
        DO k=1,Ksize
         DO j=1,sNy
          DO i=1,sNx
             fldtave(i,j,k,bi,bj)=
     &       fldtave(i,j,k,bi,bj)+fld(i,j,k,bi,bj)*deltaTloc
           ENDDO
          ENDDO
         ENDDO
 
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
CStartofinterface
      SUBROUTINE TIMEAVE_CUMUL_DIF_1T( 
     O   fldtave,
     I   fld1, fld2, Ksize, dir, deltaTloc,
     I   bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER Ksize, dir
      Real*8 fld1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
      Real*8 fld2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize)
      Real*8 fldtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
      Real*8 deltaTloc
      INTEGER bi, bj, myThid
CEndofinterface
      INTEGER i, j, k
 
      IF ( dir.eq.1 )  THEN
 
        DO k=1,Ksize
         DO j=1,sNy
          DO i=1,sNx
           fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj)
     &        - ( fld1(i,j,k,bi,bj) - fld1(i-1,j,k,bi,bj) )
     &          * recip_dxC(i,j,bi,bj)
     &          * fld2(i,j,k) * deltaTloc
          ENDDO
         ENDDO
        ENDDO
      ELSEIF ( dir.eq.2 ) THEN
 
        DO k=1,Ksize
         DO j=1,sNy
          DO i=1,sNx
           fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj)
     &        - ( fld1(i,j,k,bi,bj) - fld1(i,j-1,k,bi,bj) )
     &          * recip_dyC(i,j,bi,bj)
     &          * fld2(i,j,k) * deltaTloc
          ENDDO
         ENDDO
        ENDDO
      ELSEIF ( dir.eq.3 ) THEN
 
        DO k=2,Ksize
         DO j=1,sNy
          DO i=1,sNx
           fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj)
     &        + ( fld1(i,j,k,bi,bj) - fld1(i,j,k-1,bi,bj) )
     &          * recip_drC(k)
     &          * fld2(i,j,k) * deltaTloc
          ENDDO
         ENDDO
        ENDDO
      ENDIF
      RETURN
      END
C
C
C
CStartofinterface
      SUBROUTINE TIMEAVE_NORMA_2V( 
     U                               fldtave,
     I                               cumulWeight, Ksize,
     I                               bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER bi, bj, Ksize, myThid
      Real*8 fldtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
      Real*8 cumulWeight(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
CEndofinterface
      INTEGER i, j, k
 
        DO k=1,Ksize
         DO j=1,sNy
          DO i=1,sNx
           IF ( cumulWeight(i,j,k,bi,bj) .GT. 0.d0 ) THEN
             fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj)
     &                            / cumulWeight(i,j,k,bi,bj)
           ENDIF
          ENDDO
         ENDDO
        ENDDO
 
      RETURN
      END
C
C
C
      SUBROUTINE TIMEAVE_NORMALIZ(
     U                   fldtave,
     I                   cumulTime, kSize, bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER kSize
      Real*8 fldtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,kSize,nSx,nSy)
      Real*8 cumulTime(kSize,nSx,nSy)
      INTEGER bi, bj
      INTEGER myThid
      INTEGER i, j, k
        DO k=1,kSize
         IF ( cumulTime(k,bi,bj) .NE. 0. ) THEN
          DO j=1,sNy
           DO i=1,sNx
             fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj)
     &                            / cumulTime(k,bi,bj)
           ENDDO
          ENDDO
         ENDIF
        ENDDO
      RETURN
      END
C
C
C
      SUBROUTINE TIMEAVE_NORMALIZE(
     U                   fldtave,
     I                   timeave_cumul, Ksize,
     I                   bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER Ksize
      Real*8 fldtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
      Real*8 timeave_cumul(nSx,nSy)
      INTEGER bi, bj
      INTEGER myThid
      INTEGER i, j, k
        IF ( timeave_cumul(bi,bj) .NE. 0.d0 ) THEN
         DO k=1,Ksize
          DO j=1,sNy
           DO i=1,sNx
             fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj)
     &                            / timeave_cumul(bi,bj)
           ENDDO
          ENDDO
         ENDDO
        ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
CStartofinterface
      SUBROUTINE TIMEAVE_RESET( fldtave, Ksize, bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER bi, bj, Ksize, myThid
      Real*8 fldtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy)
CEndofinterface
      INTEGER i, j, k
 
        DO k=1,Ksize
         DO j=1-OLy,sNy+OLy
          DO i=1-OLx,sNx+OLx
             fldtave(i,j,k,bi,bj) = 0.d0
          ENDDO
         ENDDO
        ENDDO
 
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE TIMEAVE_STATVARS(
     I                   myTime, myIter, bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TAVE_TIME/ timeAve_half, timeAve_full
      Real*8 timeAve_half(nSx,nSy)
      Real*8 timeAve_full(nSx,nSy)
      COMMON /TAVE_STATEVARS/
     &                  uFluxtave,vFluxtave,tFluxtave,sFluxtave
     &                 ,etatave,uVeltave,vVeltave,wVeltave
     &                 ,thetatave,salttave,phiHydLowtave
     &                 ,UTtave,VTtave,WTtave,UStave,VStave,WStave
     &                 ,Eta2tave,TTtave,UUtave,VVtave,UVtave
     &                 ,TdiffRtave
     &                 ,uZetatave, vZetatave
     &                 ,phiHydtave
     &                 ,phiHydLow2Tave
     &                 ,ConvectCountTave
      Real*8  uFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  vFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  etatave  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  thetatave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salttave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydLowtave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  UTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  WTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  WStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  eta2Tave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  TTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UUtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VVtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UVtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 TdiffRtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 uZetatave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 vZetatave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydLow2Tave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 ConvectCountTave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8     myTime
      INTEGER myIter, bi, bj
      INTEGER myThid
      LOGICAL  DIFFERENT_MULTIPLE
      EXTERNAL DIFFERENT_MULTIPLE
      LOGICAL dumpFiles
      Real*8 DDTT
      IF ( myIter .EQ. nIter0 ) THEN
        CALL TIMEAVE_RESET(uFluxtave, 1,  bi, bj, myThid)
        CALL TIMEAVE_RESET(vFluxtave, 1,  bi, bj, myThid)
        CALL TIMEAVE_RESET(tFluxtave, 1,  bi, bj, myThid)
        CALL TIMEAVE_RESET(sFluxtave, 1,  bi, bj, myThid)
        CALL TIMEAVE_RESET(etatave,   1,  bi, bj, myThid)
        CALL TIMEAVE_RESET(thetatave, Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(salttave,  Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(uVeltave,  Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(vVeltave,  Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(wVeltave,  Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(phiHydLowtave,1, bi, bj, myThid)
        CALL TIMEAVE_RESET(UTtave,    Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(VTtave,    Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(WTtave,    Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(UStave,    Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(VStave,    Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(WStave,    Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(Eta2tave,  1,  bi, bj, myThid)
        CALL TIMEAVE_RESET(TTtave,    Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(UUtave,    Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(VVtave,    Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(UVtave,    Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(TdiffRtave,Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(uZetatave, Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(vZetatave, Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(phiHydtave,Nr, bi, bj, myThid)
        CALL TIMEAVE_RESET(phiHydLow2Tave,1, bi, bj, myThid)
        CALL TIMEAVE_RESET(ConvectCountTave,Nr,bi,bj,myThid)
        timeAve_half(bi,bj) = 0.d0
        timeAve_full(bi,bj) = 0.d0
      ENDIF
      IF ( myIter .EQ. nIter0 ) THEN
        DDTT = deltaTclock*(1.d0 - tave_lastIter)
      ELSE
        DDTT = deltaTclock
        dumpFiles = DIFFERENT_MULTIPLE(taveFreq,myTime,deltaTClock)
        IF ( dumpFiles ) DDTT = deltaTclock*tave_lastIter
      ENDIF
      IF ( DDTT .NE. 0.d0) THEN
      CALL TIMEAVE_CUMULATE(etatave,  etaN,  1 , DDTT, bi, bj, myThid)
      CALL TIMEAVE_CUMULATE(thetatave,theta, Nr, DDTT, bi, bj, myThid)
      CALL TIMEAVE_CUMULATE(salttave, salt,  Nr, DDTT, bi, bj, myThid)
      CALL TIMEAVE_CUMULATE(uVeltave, uVel,  Nr, DDTT, bi, bj, myThid)
      CALL TIMEAVE_CUMULATE(vVeltave, vVel,  Nr, DDTT, bi, bj, myThid)
      CALL TIMEAVE_CUMULATE(wVeltave, wVel,  Nr, DDTT, bi, bj, myThid)
      CALL TIMEAVE_CUMUL_2V(Eta2tave, etaN,etaN, 1,  0,
     &     DDTT, bi, bj, myThid)
      CALL TIMEAVE_CUMUL_2V(TTtave, theta,theta, Nr, 0,
     &     DDTT, bi, bj, myThid)
      CALL TIMEAVE_CUMUL_2V(UUtave, uVel,  uVel, Nr, 0,
     &     DDTT, bi, bj, myThid)
      CALL TIMEAVE_CUMUL_2V(VVtave, vVel,  vVel, Nr, 0,
     &     DDTT, bi, bj, myThid)
      CALL TIMEAVE_CUMUL_2V(UVtave, uVel,  vVel, Nr, 12,
     &     DDTT, bi, bj, myThid)
      CALL TIMEAVE_CUMUL_2V(WTtave, theta, wVel, Nr, 3,
     &     DDTT, bi, bj, myThid)
      CALL TIMEAVE_CUMUL_2V(WStave, salt,  wVel, Nr, 3,
     &     DDTT, bi, bj, myThid)
      CALL TIMEAVE_CUMUL_2VFC(UTtave, theta, uVel,  hFacW, Nr, 1,
     &     DDTT, bi, bj, myThid)
      CALL TIMEAVE_CUMUL_2VFC(VTtave, theta, vVel,  hFacS, Nr, 2,
     &     DDTT, bi, bj, myThid)
      CALL TIMEAVE_CUMUL_2VFC(UStave, salt, uVel,  hFacW, Nr, 1,
     &     DDTT, bi, bj, myThid)
      CALL TIMEAVE_CUMUL_2VFC(VStave, salt, vVel,  hFacS, Nr, 2,
     &     DDTT, bi, bj, myThid)
      timeAve_half(bi,bj) = timeAve_half(bi,bj)+DDTT
      ENDIF
      IF ( myIter .NE. nIter0 ) THEN
        CALL TIMEAVE_CUMULATE(phiHydLowtave, phiHydLow, 1,
     &                                   deltaTclock, bi, bj, myThid)
        CALL TIMEAVE_CUMULATE(phiHydtave, totPhihyd,  Nr,
     &                                   deltaTclock, bi, bj, myThid)
        CALL TIMEAVE_CUMUL_2V(phiHydLow2Tave,
     &       phiHydLow,phiHydLow, 1,  0, deltaTclock, bi, bj, myThid)
        timeAve_full(bi,bj) = timeAve_full(bi,bj)+deltaTclock
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE TIMEAVE_STATV_WRITE( myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TAVE_TIME/ timeAve_half, timeAve_full
      Real*8 timeAve_half(nSx,nSy)
      Real*8 timeAve_full(nSx,nSy)
      COMMON /TAVE_STATEVARS/
     &                  uFluxtave,vFluxtave,tFluxtave,sFluxtave
     &                 ,etatave,uVeltave,vVeltave,wVeltave
     &                 ,thetatave,salttave,phiHydLowtave
     &                 ,UTtave,VTtave,WTtave,UStave,VStave,WStave
     &                 ,Eta2tave,TTtave,UUtave,VVtave,UVtave
     &                 ,TdiffRtave
     &                 ,uZetatave, vZetatave
     &                 ,phiHydtave
     &                 ,phiHydLow2Tave
     &                 ,ConvectCountTave
      Real*8  uFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  vFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  etatave  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  thetatave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salttave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydLowtave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  UTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  WTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  WStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  eta2Tave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  TTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UUtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VVtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UVtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 TdiffRtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 uZetatave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 vZetatave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydLow2Tave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 ConvectCountTave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8     myTime
      INTEGER myIter
      INTEGER myThid
      LOGICAL  DIFFERENT_MULTIPLE
      EXTERNAL DIFFERENT_MULTIPLE
      INTEGER  IO_ERRCOUNT
      EXTERNAL IO_ERRCOUNT
      LOGICAL useVariableK
      CHARACTER*(MAX_LEN_FNAM) suff
      INTEGER bi,bj
      INTEGER beginIOErrCount
      INTEGER endIOErrCount
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      LOGICAL dumpFiles
      dumpFiles = DIFFERENT_MULTIPLE(taveFreq,myTime,deltaTClock)
      IF (dumpFiles) THEN
        useVariableK = useKPP .OR. usePP81 .OR. useMY82 .OR. useGGL90
     &      .OR. useGMredi .OR. ivdc_kappa.NE.0.
        WRITE(suff,'(I10.10)') myIter
        DO bj = myByLo(myThid), myByHi(myThid)
         DO bi = myBxLo(myThid), myBxHi(myThid)
          CALL TIMEAVE_NORMALIZE(uFluxtave,timeAve_full,1 ,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(vFluxtave,timeAve_full,1 ,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(tFluxtave,timeAve_full,1 ,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(sFluxtave,timeAve_full,1 ,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(etatave,  timeAve_half,1 ,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(thetatave,timeAve_half,Nr,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(salttave, timeAve_half,Nr,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(uVeltave, timeAve_half,Nr,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(vVeltave, timeAve_half,Nr,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(wVeltave, timeAve_half,Nr,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(phiHydLowtave,timeAve_full,1,
     &         bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(UTtave,   timeAve_half,Nr,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(VTtave,   timeAve_half,Nr,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(WTtave,   timeAve_half,Nr,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(UStave,   timeAve_half,Nr,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(VStave,   timeAve_half,Nr,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(WStave,   timeAve_half,Nr,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(Eta2tave, timeAve_half,1 ,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(TTtave,   timeAve_half,Nr,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(UUtave,   timeAve_half,Nr,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(VVtave,   timeAve_half,Nr,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(UVtave,   timeAve_half,Nr,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(TdiffRtave,timeAve_full,Nr,
     &         bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(uZetatave,timeAve_full,Nr,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(vZetatave,timeAve_full,Nr,bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(phiHydtave,timeAve_full,Nr,
     &         bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(phiHydLow2Tave,timeAve_full,1,
     &         bi,bj,myThid)
          CALL TIMEAVE_NORMALIZE(ConvectCountTave,timeAve_full,Nr,
     &         bi,bj,myThid)
         ENDDO
        ENDDO
        CALL BARRIER(myThid)
        IF (timeave_mdsio) THEN
          beginIOErrCount = IO_ERRCOUNT(myThid)
          CALL WRITE_FLD_XY_RL('ETAtave.' ,suff,etatave  ,myIter,myThid)
          CALL WRITE_FLD_XYZ_RL('Ttave.',suff,thetatave,myIter,myThid)
          CALL WRITE_FLD_XYZ_RL('Stave.',suff,salttave,myIter,myThid)
          CALL WRITE_FLD_XYZ_RL('uVeltave.',suff,uVeltave,myIter,myThid)
          CALL WRITE_FLD_XYZ_RL('vVeltave.',suff,vVeltave,myIter,myThid)
          CALL WRITE_FLD_XYZ_RL('wVeltave.',suff,wVeltave,myIter,myThid)
          CALL WRITE_FLD_XY_RL('Eta2tave.',suff,Eta2tave ,myIter,myThid)
          CALL WRITE_FLD_XYZ_RL('UTtave.',suff,UTtave,myIter,myThid)
          CALL WRITE_FLD_XYZ_RL('VTtave.',suff,VTtave,myIter,myThid)
          CALL WRITE_FLD_XYZ_RL('WTtave.',suff,WTtave,myIter,myThid)
          CALL WRITE_FLD_XYZ_RL('UStave.',suff,UStave,myIter,myThid)
          CALL WRITE_FLD_XYZ_RL('VStave.',suff,VStave,myIter,myThid)
          CALL WRITE_FLD_XYZ_RL('WStave.',suff,WStave,myIter,myThid)
          CALL WRITE_FLD_XYZ_RL('TTtave.',suff,TTtave,myIter,myThid)
          CALL WRITE_FLD_XYZ_RL('UUtave.',suff,UUtave,myIter,myThid)
          CALL WRITE_FLD_XYZ_RL('VVtave.',suff,VVtave,myIter,myThid)
          CALL WRITE_FLD_XYZ_RL('UVtave.',suff,UVtave,myIter,myThid)
          IF (useVariableK)
     &         CALL WRITE_FLD_XYZ_RL('Tdiftave.',suff,TdiffRtave,
     &         myIter,myThid)
          IF (vectorInvariantMomentum) THEN
            CALL WRITE_FLD_XYZ_RL('uZtave.',suff,uZetatave,
     &           myIter,myThid)
            CALL WRITE_FLD_XYZ_RL('vZtave.',suff,vZetatave,
     &           myIter,myThid)
          ENDIF
          CALL WRITE_FLD_XYZ_RL('PhHytave.',suff,phiHydtave,
     &         myIter,myThid)
          IF ( fluidIsWater ) THEN
            CALL WRITE_FLD_XY_RL('PHLtave.',suff,phiHydLowtave,
     &           myIter,myThid)
            CALL WRITE_FLD_XY_RL('uFluxtave.',suff,uFluxtave,
     &           myIter,myThid)
            CALL WRITE_FLD_XY_RL('vFluxtave.',suff,vFluxtave,
     &           myIter,myThid)
            CALL WRITE_FLD_XY_RL('tFluxtave.',suff,tFluxtave,
     &           myIter,myThid)
            CALL WRITE_FLD_XY_RL('sFluxtave.',suff,sFluxtave,
     &           myIter,myThid)
            CALL WRITE_FLD_XY_RL('PHL2tave.',suff,phiHydLow2tave,
     &           myIter,myThid)
            CALL WRITE_FLD_XYZ_RL('Convtave.',suff,ConvectCountTave,
     &           myIter,myThid)
          ENDIF
          endIOErrCount = IO_ERRCOUNT(myThid)
          IF ( endIOErrCount .NE. beginIOErrCount ) THEN
            WRITE(msgBuf,'(A)')  'S/R WRITE_TIME_AVERAGES'
            CALL PRINT_ERROR( msgBuf, myThid )
            WRITE(msgBuf,'(A)')  'Error writing out data'
            CALL PRINT_ERROR( msgBuf, myThid )
            WRITE(msgBuf,'(A,I10)') 'Timestep ',myIter
            CALL PRINT_ERROR( msgBuf, myThid )
          ELSE
            IF (  myThid  .EQ. 1 ) THEN
            WRITE(msgBuf,'(A,I10)')
     &           '// Time-average data written, t-step', myIter
            CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &           SQUEEZE_RIGHT, myThid )
            WRITE(msgBuf,'(A)')  ' '
            CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &           SQUEEZE_RIGHT, myThid )
            ENDIF
          ENDIF
        ENDIF
        CALL BARRIER(myThid)
        DO bj = myByLo(myThid), myByHi(myThid)
          DO bi = myBxLo(myThid), myBxHi(myThid)
            CALL TIMEAVE_STATVARS(myTime, nIter0, bi, bj, myThid)
          ENDDO
        ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE TIMEAVE_SURF_FLUX(
     I     bi, bj, myTime, myIter, myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TAVE_TIME/ timeAve_half, timeAve_full
      Real*8 timeAve_half(nSx,nSy)
      Real*8 timeAve_full(nSx,nSy)
      COMMON /TAVE_STATEVARS/
     &                  uFluxtave,vFluxtave,tFluxtave,sFluxtave
     &                 ,etatave,uVeltave,vVeltave,wVeltave
     &                 ,thetatave,salttave,phiHydLowtave
     &                 ,UTtave,VTtave,WTtave,UStave,VStave,WStave
     &                 ,Eta2tave,TTtave,UUtave,VVtave,UVtave
     &                 ,TdiffRtave
     &                 ,uZetatave, vZetatave
     &                 ,phiHydtave
     &                 ,phiHydLow2Tave
     &                 ,ConvectCountTave
      Real*8  uFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  vFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  etatave  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  thetatave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salttave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydLowtave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  UTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  WTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  WStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  eta2Tave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  TTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UUtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VVtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UVtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 TdiffRtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 uZetatave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 vZetatave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydLow2Tave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 ConvectCountTave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER bi, bj
      Real*8     myTime
      INTEGER myIter
      INTEGER myThid
      INTEGER I, J, K
      Real*8 tmpFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
       IF ( usingPCoords ) THEN
        k=Nr
       ELSE
        k=1
       ENDIF
       DO j=1,sNy
        DO i=1,sNx
         tmpFld(i,j)=fu(i,j,bi,bj)*foFacMom*maskW(i,j,k,bi,bj)
        ENDDO
       ENDDO
       CALL TIMEAVE_CUMUL_1T(uFluxtave,tmpFld,1,
     &                                   deltaTclock, bi, bj, myThid)
       DO j=1,sNy
        DO i=1,sNx
         tmpFld(i,j)=fv(i,j,bi,bj)*foFacMom*maskS(i,j,k,bi,bj)
        ENDDO
       ENDDO
       CALL TIMEAVE_CUMUL_1T(vFluxtave,tmpFld,1,
     &                                   deltaTclock, bi, bj, myThid)
       DO j=1,sNy
        DO i=1,sNx
         tmpFld(i,j) =
     &    (surfaceForcingT(i,j,bi,bj)+surfaceForcingTice(I,J,bi,bj))
     &    *HeatCapacity_Cp*rUnit2mass
        ENDDO
       ENDDO
       CALL TIMEAVE_CUMUL_1T( tFluxtave, tmpFld, 1,
     &                                   deltaTclock, bi, bj, myThid)
       DO j=1,sNy
        DO i=1,sNx
         tmpFld(i,j)=
     &    surfaceForcingS(i,j,bi,bj)*rUnit2mass
        ENDDO
       ENDDO
       CALL TIMEAVE_CUMUL_1T( sFluxtave, tmpFld, 1,
     &                                   deltaTclock, bi, bj, myThid)
      RETURN
      END
C
C
C
      LOGICAL FUNCTION DIFFERENT_MULTIPLE( freq, val1, step )
      IMPLICIT NONE
      Real*8  freq, val1, step
      Real*8  v1, v2, v3, v4, d1, d2, d3
      DIFFERENT_MULTIPLE = .FALSE.
      IF ( freq .NE. 0. ) THEN
        IF ( ABS(step) .GT. freq ) THEN
         DIFFERENT_MULTIPLE = .TRUE.
        ELSE
          v1 = val1
          v2 = val1 - step
          v3 = val1 + step
          v4 = NINT(v1/freq)*freq
          d1 = v1-v4
          d2 = v2-v4
          d3 = v3-v4
          IF ( ABS(d1) .LT. ABS(d2) .AND. ABS(d1) .LE. ABS(d3) )
     &        DIFFERENT_MULTIPLE = .TRUE.
        ENDIF
      ENDIF
      RETURN
      END
C
C
C
      SUBROUTINE FILL_CS_CORNER_TR_RL(
     I     fill4dir, withSigns,
     U     trFld,
     I     bi,bj, myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
      INTEGER fill4dir
      LOGICAL withSigns
      Real*8 trFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER bi,bj
      INTEGER myThid
      INTEGER i,j
      LOGICAL southWestCorner
      LOGICAL southEastCorner
      LOGICAL northWestCorner
      LOGICAL northEastCorner
      Real*8     negOne
      negOne = 1.
      IF (withSigns) negOne = -1.
      IF (useCubedSphereExchange) THEN
       southWestCorner = .TRUE.
       southEastCorner = .TRUE.
       northWestCorner = .TRUE.
       northEastCorner = .TRUE.
       IF ( fill4dir .EQ. 0 ) THEN
         IF ( southWestCorner ) THEN
          DO j=1,OLy
           DO i=1,OLx
            trFld( 1-i , 1-j ) = 0.d0
           ENDDO
          ENDDO
         ENDIF
         IF ( southEastCorner ) THEN
          DO j=1,OLy
           DO i=1,OLx
            trFld(sNx+i, 1-j ) = 0.d0
           ENDDO
          ENDDO
         ENDIF
         IF ( northWestCorner ) THEN
          DO j=1,OLy
           DO i=1,OLx
            trFld( 1-i ,sNy+j) = 0.d0
           ENDDO
          ENDDO
         ENDIF
         IF ( northEastCorner ) THEN
          DO j=1,OLy
           DO i=1,OLx
            trFld(sNx+i,sNy+j) = 0.d0
           ENDDO
          ENDDO
         ENDIF
       ELSEIF ( fill4dir .EQ. 1 ) THEN
C
C
C
C
         IF ( southWestCorner ) THEN
          DO j=1,OLy
           DO i=1,OLx
            trFld( 1-i , 1-j ) = negOne*trFld( 1-j , i  )
           ENDDO
          ENDDO
         ENDIF
         IF ( southEastCorner ) THEN
          DO j=1,OLy
           DO i=1,OLx
            trFld(sNx+i, 1-j ) = negOne*trFld(sNx+j, i  )
           ENDDO
          ENDDO
         ENDIF
         IF ( northWestCorner ) THEN
          DO j=1,OLy
           DO i=1,OLx
            trFld( 1-i ,sNy+j) = negOne*trFld( 1-j , sNy+1-i )
           ENDDO
          ENDDO
         ENDIF
         IF ( northEastCorner ) THEN
          DO j=1,OLy
           DO i=1,OLx
            trFld(sNx+i,sNy+j) = negOne*trFld(sNx+j, sNy+1-i )
           ENDDO
          ENDDO
         ENDIF
       ELSEIF ( fill4dir .EQ. 2 ) THEN
C
C
C
         IF ( southWestCorner ) THEN
          DO j=1,Oly
           DO i=1,Olx
            trFld( 1-i , 1-j ) = negOne*trFld(   j   , 1-i )
           ENDDO
          ENDDO
         ENDIF
         IF ( southEastCorner ) THEN
          DO j=1,Oly
           DO i=1,Olx
            trFld(sNx+i, 1-j ) = negOne*trFld(sNx+1-j, 1-i )
           ENDDO
          ENDDO
         ENDIF
         IF ( northWestCorner ) THEN
          DO j=1,Oly
           DO i=1,Olx
            trFld( 1-i ,sNy+j) = negOne*trFld(   j   ,sNy+i)
           ENDDO
          ENDDO
         ENDIF
         IF ( northEastCorner ) THEN
          DO j=1,Oly
           DO i=1,Olx
            trFld(sNx+i,sNy+j) = negOne*trFld(sNx+1-j,sNy+i)
           ENDDO
          ENDDO
         ENDIF
       ELSE
         STOP 'FILL_CS_CORNER_TR_RL: fill4dir has illegal value'
       ENDIF
      ENDIF
      RETURN
      END
C
C
C
      SUBROUTINE FILL_CS_CORNER_UV_RS(
     I     withSigns,
     U     uFld, vFld,
     I     bi,bj, myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
      LOGICAL withSigns
      Real*8     uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8     vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER bi,bj
      INTEGER myThid
      INTEGER i,j
      LOGICAL southWestCorner
      LOGICAL southEastCorner
      LOGICAL northWestCorner
      LOGICAL northEastCorner
      Real*8 negOne
      IF (useCubedSphereExchange) THEN
       negOne = 1.d0
       IF (withSigns) negOne = -1.d0
       southWestCorner = .TRUE.
       southEastCorner = .TRUE.
       northWestCorner = .TRUE.
       northEastCorner = .TRUE.
C
C
        IF ( southWestCorner ) THEN
          DO j=1,OLy
           DO i=1,OLx
            uFld( 1-i , 1-j ) = negOne*vFld( 1-j , 1+i )
           ENDDO
          ENDDO
          DO j=1,OLy
           DO i=1,OLx
            vFld( 1-i , 1-j ) = negOne*uFld( 1+j , 1-i )
           ENDDO
          ENDDO
        ENDIF
        IF ( southEastCorner ) THEN
          DO j=1,OLy
           DO i=2,OLx
            uFld(sNx+i, 1-j ) = vFld(sNx+j, i  )
           ENDDO
          ENDDO
          DO j=1,OLy
           DO i=1,OLx
            vFld(sNx+i, 1-j ) = uFld(sNx+1-j, 1-i  )
           ENDDO
          ENDDO
        ENDIF
        IF ( northWestCorner ) THEN
          DO j=1,OLy
           DO i=1,OLx
            uFld( 1-i ,sNy+j) = vFld( 1-j , sNy+1-i )
           ENDDO
          ENDDO
          DO j=2,OLy
           DO i=1,OLx
            vFld( 1-i ,sNy+j) = uFld(  j  , sNy+i )
           ENDDO
          ENDDO
        ENDIF
        IF ( northEastCorner ) THEN
          DO j=1,OLy
           DO i=2,OLx
            uFld(sNx+i,sNy+j) = negOne*vFld(sNx+j, sNy+2-i )
           ENDDO
          ENDDO
          DO j=2,OLy
           DO i=1,OLx
            vFld(sNx+i,sNy+j) = negOne*uFld(sNx+2-j, sNy+i )
           ENDDO
          ENDDO
        ENDIF
      ENDIF
      RETURN
      END
C
C
C
      SUBROUTINE LEF_ZERO( arr ,myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      Real*8  arr (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      INTEGER i,j,bi,bj
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          arr(i,j,bi,bj)=0.
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
      SUBROUTINE EXCH_3D_RS(
     U                       phi,
     I                       myNz, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER myNz
      Real*8 phi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,1:myNz,nSx,nSy)
      INTEGER myThid
      INTEGER OLw, OLe, OLn, OLs, exchWidthX, exchWidthY
      OLw        = OLx
      OLe        = OLx
      OLn        = OLy
      OLs        = OLy
      exchWidthX = OLx
      exchWidthY = OLy
      IF (useCubedSphereExchange) THEN
       CALL EXCH1_RS_CUBE( phi, .FALSE.,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ELSE
       CALL EXCH1_RS( phi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ENDIF
      RETURN
      END
C
C
C
      SUBROUTINE EXCH_3D_RL(
     U                       phi,
     I                       myNz, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER myNz
      Real*8 phi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,1:myNz,nSx,nSy)
      INTEGER myThid
      INTEGER OLw, OLe, OLn, OLs, exchWidthX, exchWidthY
      OLw        = OLx
      OLe        = OLx
      OLn        = OLy
      OLs        = OLy
      exchWidthX = OLx
      exchWidthY = OLy
      IF (useCubedSphereExchange) THEN
       CALL EXCH1_RL_CUBE( phi, .FALSE.,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ELSE
       CALL EXCH1_RL( phi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ENDIF
      RETURN
      END
C
C
C
      SUBROUTINE EXCH_XY_RL(
     U                       phi,
     I                       myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      Real*8 phi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      INTEGER OLw, OLe, OLn, OLs, exchWidthX, exchWidthY, myNz
      OLw        = OLx
      OLe        = OLx
      OLn        = OLy
      OLs        = OLy
      exchWidthX = OLx
      exchWidthY = OLy
      myNz       = 1
      IF (useCubedSphereExchange) THEN
       CALL EXCH1_RL_CUBE( phi, .FALSE.,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ELSE
       CALL EXCH1_RL( phi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ENDIF
      RETURN
      END
C
C
C
      SUBROUTINE EXCH_XY_RS(
     U                       phi,
     I                       myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      Real*8 phi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      INTEGER OLw, OLe, OLn, OLs, exchWidthX, exchWidthY, myNz
      OLw        = OLx
      OLe        = OLx
      OLn        = OLy
      OLs        = OLy
      exchWidthX = OLx
      exchWidthY = OLy
      myNz       = 1
      IF (useCubedSphereExchange) THEN
       CALL EXCH1_RS_CUBE( phi, .FALSE.,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ELSE
       CALL EXCH1_RS( phi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ENDIF
      RETURN
      END
C
C
C
      SUBROUTINE EXCH_XYZ_RL(
     U                       phi,
     I                       myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      Real*8 phi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,1:Nr,nSx,nSy)
      INTEGER myThid
      INTEGER OLw, OLe, OLn, OLs, exchWidthX, exchWidthY, myNz
      OLw        = OLx
      OLe        = OLx
      OLn        = OLy
      OLs        = OLy
      exchWidthX = OLx
      exchWidthY = OLy
      myNz       = Nr
      IF (useCubedSphereExchange) THEN
       CALL EXCH1_RL_CUBE( phi, .FALSE.,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ELSE
       CALL EXCH1_RL( phi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ENDIF
      RETURN
      END
C
C
C
      SUBROUTINE EXCH_XYZ_RS(
     U                       phi,
     I                       myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      Real*8 phi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,1:Nr,nSx,nSy)
      INTEGER myThid
      INTEGER OLw, OLe, OLn, OLs, exchWidthX, exchWidthY, myNz
      OLw        = OLx
      OLe        = OLx
      OLn        = OLy
      OLs        = OLy
      exchWidthX = OLx
      exchWidthY = OLy
      myNz       = Nr
      IF (useCubedSphereExchange) THEN
       CALL EXCH1_RS_CUBE( phi, .FALSE.,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ELSE
       CALL EXCH1_RS( phi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ENDIF
      RETURN
      END
C
C
C
      SUBROUTINE EXCH_UV_3D_RS(
     U                          Uphi, Vphi,
     I                          withSigns, myNz, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER myNz
      Real*8 Uphi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNz,nSx,nSy)
      Real*8 Vphi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNz,nSx,nSy)
      LOGICAL withSigns
      INTEGER myThid
      INTEGER OLw, OLe, OLn, OLs, exchWidthX, exchWidthY
      OLw        = OLx
      OLe        = OLx
      OLn        = OLy
      OLs        = OLy
      exchWidthX = OLx
      exchWidthY = OLy
      IF (useCubedSphereExchange) THEN
       CALL EXCH1_UV_RS_CUBE( Uphi, Vphi, withSigns,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ELSE
       CALL EXCH1_RS( Uphi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
       CALL EXCH1_RS( Vphi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ENDIF
      RETURN
      END
C
C
C
      SUBROUTINE EXCH_UV_3D_RL(
     U                          Uphi, Vphi,
     I                          withSigns, myNz, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER myNz
      Real*8 Uphi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNz,nSx,nSy)
      Real*8 Vphi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNz,nSx,nSy)
      LOGICAL withSigns
      INTEGER myThid
      INTEGER OLw, OLe, OLn, OLs, exchWidthX, exchWidthY
      OLw        = OLx
      OLe        = OLx
      OLn        = OLy
      OLs        = OLy
      exchWidthX = OLx
      exchWidthY = OLy
      IF (useCubedSphereExchange) THEN
       CALL EXCH1_UV_RL_CUBE( Uphi, Vphi, withSigns,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ELSE
       CALL EXCH1_RL( Uphi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
       CALL EXCH1_RL( Vphi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ENDIF
      RETURN
      END
C
C
C
      SUBROUTINE EXCH_UV_XY_RS(
     U                          Uphi, Vphi,
     I                          withSigns, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      Real*8 Uphi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Vphi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      LOGICAL withSigns
      INTEGER myThid
      INTEGER OLw, OLe, OLn, OLs, exchWidthX, exchWidthY, myNz
      OLw        = OLx
      OLe        = OLx
      OLn        = OLy
      OLs        = OLy
      exchWidthX = OLx
      exchWidthY = OLy
      myNz       = 1
      IF (useCubedSphereExchange) THEN
       CALL EXCH1_UV_RS_CUBE( Uphi, Vphi, withSigns,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ELSE
       CALL EXCH1_RS( Uphi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
       CALL EXCH1_RS( Vphi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ENDIF
      RETURN
      END
C
C
C
      SUBROUTINE EXCH_UV_XY_RL(
     U                          Uphi, Vphi,
     I                          withSigns, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      Real*8 Uphi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Vphi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      LOGICAL withSigns
      INTEGER myThid
      INTEGER OLw, OLe, OLn, OLs, exchWidthX, exchWidthY, myNz
      OLw        = OLx
      OLe        = OLx
      OLn        = OLy
      OLs        = OLy
      exchWidthX = OLx
      exchWidthY = OLy
      myNz       = 1
      IF (useCubedSphereExchange) THEN
       CALL EXCH1_UV_RL_CUBE( Uphi, Vphi, withSigns,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ELSE
       CALL EXCH1_RL( Uphi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
       CALL EXCH1_RL( Vphi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ENDIF
      RETURN
      END
C
C
C
      SUBROUTINE EXCH_UV_XYZ_RS(
     U                          Uphi, Vphi,
     I                          withSigns, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      Real*8 Uphi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Vphi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      LOGICAL withSigns
      INTEGER myThid
      INTEGER OLw, OLe, OLn, OLs, exchWidthX, exchWidthY, myNz
      OLw        = OLx
      OLe        = OLx
      OLn        = OLy
      OLs        = OLy
      exchWidthX = OLx
      exchWidthY = OLy
      myNz       = Nr
      IF (useCubedSphereExchange) THEN
       CALL EXCH1_UV_RS_CUBE( Uphi, Vphi, withSigns,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ELSE
       CALL EXCH1_RS( Uphi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
       CALL EXCH1_RS( Vphi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ENDIF
      RETURN
      END
C
C
C
      SUBROUTINE EXCH_UV_XYZ_RL(
     U                          Uphi, Vphi,
     I                          withSigns, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      Real*8 Uphi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Vphi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      LOGICAL withSigns
      INTEGER myThid
      INTEGER OLw, OLe, OLn, OLs, exchWidthX, exchWidthY, myNz
      OLw        = OLx
      OLe        = OLx
      OLn        = OLy
      OLs        = OLy
      exchWidthX = OLx
      exchWidthY = OLy
      myNz       = Nr
      IF (useCubedSphereExchange) THEN
       CALL EXCH1_UV_RL_CUBE( Uphi, Vphi, withSigns,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ELSE
       CALL EXCH1_RL( Uphi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
       CALL EXCH1_RL( Vphi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ENDIF
      RETURN
      END
C
C
C
      SUBROUTINE EXCH_UV_AGRID_3D_RS(
     U                                Uphi, Vphi,
     I                                withSigns, myNz, myThid )
C
C
C
C
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER myNz
      Real*8 Uphi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNz,nSx,nSy)
      Real*8 Vphi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNz,nSx,nSy)
      LOGICAL withSigns
      INTEGER myThid
      INTEGER i,j,k,bi,bj
      INTEGER OLw, OLe, OLn, OLs, exchWidthX, exchWidthY
      Real*8 dummy1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 dummy2(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 negOne
      OLw        = OLx
      OLe        = OLx
      OLn        = OLy
      OLs        = OLy
      exchWidthX = OLx
      exchWidthY = OLy
      negOne = 1.
      IF (withSigns) negOne = -1.
      IF (useCubedSphereExchange) THEN
       CALL EXCH1_RS_CUBE( Uphi, .FALSE.,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
       CALL EXCH1_RS_CUBE( Vphi, .FALSE.,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
       DO bj = myByLo(myThid), myByHi(myThid)
        DO bi = myBxLo(myThid), myBxHi(myThid)
         DO k = 1,myNz
          DO j = 1-OLy,sNy+OLy
           DO i = 1-OLx,sNx+OLx
             dummy1(i,j) = Uphi(i,j,k,bi,bj)
             dummy2(i,j) = Vphi(i,j,k,bi,bj)
           ENDDO
          ENDDO
          IF ( MOD(bi,2).EQ.1 ) THEN
           DO j = 1,sNy
            DO i = 1,exchWidthX
             Uphi(1-i,j,k,bi,bj) = dummy2(1-i,j)
             Vphi(1-i,j,k,bi,bj) = dummy1(1-i,j)*negOne
            ENDDO
           ENDDO
           DO j = 1,exchWidthY
            DO i = 1,sNx
             Uphi(i,sNy+j,k,bi,bj) = dummy2(i,sNy+j)*negOne
             Vphi(i,sNy+j,k,bi,bj) = dummy1(i,sNy+j)
            ENDDO
           ENDDO
          ELSE
           DO j = 1,sNy
            DO i = 1,exchWidthX
             Uphi(sNx+i,j,k,bi,bj) = dummy2(sNx+i,j)
             Vphi(sNx+i,j,k,bi,bj) = dummy1(sNx+i,j)*negOne
            ENDDO
           ENDDO
           DO j = 1,exchWidthY
            DO i = 1,sNx
             Uphi(i,1-j,k,bi,bj) = dummy2(i,1-j)*negOne
             Vphi(i,1-j,k,bi,bj) = dummy1(i,1-j)
            ENDDO
           ENDDO
          ENDIF
         ENDDO
        ENDDO
       ENDDO
      ELSE
       CALL EXCH1_RS( Uphi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
       CALL EXCH1_RS( Vphi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ENDIF
      RETURN
      END
C
C
C
      SUBROUTINE EXCH_UV_AGRID_3D_RL(
     U                                Uphi, Vphi,
     I                                withSigns, myNz, myThid )
C
C
C
C
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER myNz
      Real*8 Uphi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNz,nSx,nSy)
      Real*8 Vphi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNz,nSx,nSy)
      LOGICAL withSigns
      INTEGER myThid
      INTEGER i,j,k,bi,bj
      INTEGER OLw, OLe, OLn, OLs, exchWidthX, exchWidthY
      Real*8 dummy1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 dummy2(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 negOne
      OLw        = OLx
      OLe        = OLx
      OLn        = OLy
      OLs        = OLy
      exchWidthX = OLx
      exchWidthY = OLy
      negOne = 1.
      IF (withSigns) negOne = -1.
      IF (useCubedSphereExchange) THEN
       CALL EXCH1_RL_CUBE( Uphi, .FALSE.,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
       CALL EXCH1_RL_CUBE( Vphi, .FALSE.,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
       DO bj = myByLo(myThid), myByHi(myThid)
        DO bi = myBxLo(myThid), myBxHi(myThid)
         DO k = 1,myNz
          DO j = 1-OLy,sNy+OLy
           DO i = 1-OLx,sNx+OLx
             dummy1(i,j) = Uphi(i,j,k,bi,bj)
             dummy2(i,j) = Vphi(i,j,k,bi,bj)
           ENDDO
          ENDDO
          IF ( MOD(bi,2).EQ.1 ) THEN
           DO j = 1,sNy
            DO i = 1,exchWidthX
             Uphi(1-i,j,k,bi,bj) = dummy2(1-i,j)
             Vphi(1-i,j,k,bi,bj) = dummy1(1-i,j)*negOne
            ENDDO
           ENDDO
           DO j = 1,exchWidthY
            DO i = 1,sNx
             Uphi(i,sNy+j,k,bi,bj) = dummy2(i,sNy+j)*negOne
             Vphi(i,sNy+j,k,bi,bj) = dummy1(i,sNy+j)
            ENDDO
           ENDDO
          ELSE
           DO j = 1,sNy
            DO i = 1,exchWidthX
             Uphi(sNx+i,j,k,bi,bj) = dummy2(sNx+i,j)
             Vphi(sNx+i,j,k,bi,bj) = dummy1(sNx+i,j)*negOne
            ENDDO
           ENDDO
           DO j = 1,exchWidthY
            DO i = 1,sNx
             Uphi(i,1-j,k,bi,bj) = dummy2(i,1-j)*negOne
             Vphi(i,1-j,k,bi,bj) = dummy1(i,1-j)
            ENDDO
           ENDDO
          ENDIF
         ENDDO
        ENDDO
       ENDDO
      ELSE
       CALL EXCH1_RL( Uphi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
       CALL EXCH1_RL( Vphi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ENDIF
      RETURN
      END
C
C
C
      SUBROUTINE EXCH_UV_DGRID_3D_RS(
     U                                 uPhi, vPhi,
     I                                 withSigns, myNz, myThid )
C
C
C
C
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER myNz
      Real*8 uPhi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNz,nSx,nSy)
      Real*8 vPhi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNz,nSx,nSy)
      LOGICAL withSigns
      INTEGER myThid
      INTEGER i,j,k,bi,bj
      INTEGER OLw, OLe, OLn, OLs, exchWidthX, exchWidthY
      Real*8 negOne
      INTEGER  myFace
      OLw        = OLx
      OLe        = OLx
      OLn        = OLy
      OLs        = OLy
      exchWidthX = OLx
      exchWidthY = OLy
      negOne = 1.
      IF (withSigns) negOne = -1.
      IF ( useCubedSphereExchange ) THEN
      CALL EXCH_UV_3D_RS(
     U                     vPhi, uPhi,
     I                     .FALSE., myNz, myThid )
       DO bj = myByLo(myThid), myByHi(myThid)
        DO bi = myBxLo(myThid), myBxHi(myThid)
         myFace = bi
         DO k = 1,myNz
          IF ( MOD(myFace,2).EQ.1 ) THEN
             DO j = 1,exchWidthY
              DO i = 1-OLx,sNx+OLx
               uPhi(i,sNy+j,k,bi,bj) = uPhi(i,sNy+j,k,bi,bj)*negOne
              ENDDO
             ENDDO
             DO j = 1-OLy,sNy+OLy
              DO i = 1,exchWidthX
               vPhi(1-i,j,k,bi,bj) = vPhi(1-i,j,k,bi,bj)*negOne
              ENDDO
             ENDDO
          ELSE
             DO j = 1-OLy,sNy+OLy
              DO i = 1,exchWidthX
               vPhi(sNx+i,j,k,bi,bj) = vPhi(sNx+i,j,k,bi,bj)*negOne
              ENDDO
             ENDDO
             DO j = 1,exchWidthY
              DO i = 1-OLx,sNx+OLx
               uPhi(i,1-j,k,bi,bj) = uPhi(i,1-j,k,bi,bj)*negOne
              ENDDO
             ENDDO
          ENDIF
         ENDDO
        ENDDO
       ENDDO
      ELSE
       CALL EXCH1_RS( uPhi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
       CALL EXCH1_RS( vPhi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ENDIF
      RETURN
      END
C
C
C
      SUBROUTINE EXCH_UV_DGRID_3D_RL(
     U                                 uPhi, vPhi,
     I                                 withSigns, myNz, myThid )
C
C
C
C
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER myNz
      Real*8 uPhi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNz,nSx,nSy)
      Real*8 vPhi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,myNz,nSx,nSy)
      LOGICAL withSigns
      INTEGER myThid
      INTEGER i,j,k,bi,bj
      INTEGER OLw, OLe, OLn, OLs, exchWidthX, exchWidthY
      Real*8 negOne
      INTEGER  myFace
      OLw        = OLx
      OLe        = OLx
      OLn        = OLy
      OLs        = OLy
      exchWidthX = OLx
      exchWidthY = OLy
      negOne = 1.
      IF (withSigns) negOne = -1.
      IF ( useCubedSphereExchange ) THEN
      CALL EXCH_UV_3D_RL(
     U                     vPhi, uPhi,
     I                     .FALSE., myNz, myThid )
       DO bj = myByLo(myThid), myByHi(myThid)
        DO bi = myBxLo(myThid), myBxHi(myThid)
         myFace = bi
         DO k = 1,myNz
          IF ( MOD(myFace,2).EQ.1 ) THEN
             DO j = 1,exchWidthY
              DO i = 1-OLx,sNx+OLx
               uPhi(i,sNy+j,k,bi,bj) = uPhi(i,sNy+j,k,bi,bj)*negOne
              ENDDO
             ENDDO
             DO j = 1-OLy,sNy+OLy
              DO i = 1,exchWidthX
               vPhi(1-i,j,k,bi,bj) = vPhi(1-i,j,k,bi,bj)*negOne
              ENDDO
             ENDDO
          ELSE
             DO j = 1-OLy,sNy+OLy
              DO i = 1,exchWidthX
               vPhi(sNx+i,j,k,bi,bj) = vPhi(sNx+i,j,k,bi,bj)*negOne
              ENDDO
             ENDDO
             DO j = 1,exchWidthY
              DO i = 1-OLx,sNx+OLx
               uPhi(i,1-j,k,bi,bj) = uPhi(i,1-j,k,bi,bj)*negOne
              ENDDO
             ENDDO
          ENDIF
         ENDDO
        ENDDO
       ENDDO
      ELSE
       CALL EXCH1_RL( uPhi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
       CALL EXCH1_RL( vPhi,
     I            OLw, OLe, OLs, OLn, myNz,
     I            exchWidthX, exchWidthY,
     I            EXCH_UPDATE_CORNERS, myThid )
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE ADAMS_BASHFORTH2(
     I                     bi, bj, k,
     U                     gTracer, gTrNm1,
     I                     startAB, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER bi,bj,k
      Real*8  gTracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gTrNm1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER startAB
      INTEGER myIter, myThid
      INTEGER i,j
      Real*8 ab15,ab05
      Real*8 gTrtmp
      IF ( myIter.EQ.nIter0 .AND. startAB.EQ.0 ) THEN
       ab15 = 1.d0
       ab05 = 0.d0
      ELSE
       ab15 = 1.5d0 + abEps
       ab05 = -( 0.5d0 + abEps )
      ENDIF
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
        gTrtmp = ab15*gTracer(i,j,k,bi,bj)
     &         + ab05*gTrNm1(i,j,k,bi,bj)
        gTrNm1(i,j,k,bi,bj) = gTracer(i,j,k,bi,bj)
        gTracer(i,j,k,bi,bj) = gTrtmp
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE ADAMS_BASHFORTH3(
     I                     bi, bj, kArg,
     U                     gTracer, gTrNm,
     I                     startAB, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER bi,bj,kArg
      Real*8  gTracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gTrNm  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy,2)
      INTEGER startAB
      INTEGER myIter, myThid
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CALC_3D_DIFFUSIVITY(
     I        bi,bj,iMin,iMax,jMin,jMax,
     I        trIdentity, trUseGMRedi, trUseKPP,
     O        KappaRTr,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,iMin,iMax,jMin,jMax
      INTEGER trIdentity
      LOGICAL trUseGMRedi, trUseKPP
      Real*8 KappaRTr(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      INTEGER myThid
      INTEGER i,j,k
      Real*8 KbryanLewis79
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      IF ( .NOT. trUseKPP ) THEN
       DO k = 1,Nr
        KbryanLewis79=diffKrBL79surf+(diffKrBL79deep-diffKrBL79surf)
     &       *(atan(-(rF(k)-diffKrBL79Ho)/diffKrBL79scl)/PI+0.5d0)
        DO j = 1-Oly,sNy+Oly
         DO i = 1-Olx,sNx+Olx
          IF ( .TRUE. ) THEN
           KappaRTr(i,j,k) =
     &         IVDConvCount(i,j,k,bi,bj)*ivdc_kappa
     &         + KbryanLewis79
          ENDIF
         ENDDO
        ENDDO
       ENDDO
       IF ( trIdentity.EQ.GAD_TEMPERATURE ) THEN
        DO k = 1,Nr
         DO j = 1-Oly,sNy+Oly
          DO i = 1-Olx,sNx+Olx
           KappaRTr(i,j,k) = KappaRTr(i,j,k)
     &          + diffKrNrT(k)
          ENDDO
         ENDDO
        ENDDO
       ELSEIF ( trIdentity.EQ.GAD_SALINITY) THEN
        DO k = 1,Nr
         DO j = 1-Oly, sNy+Oly
          DO i = 1-Olx, sNx+Olx
           KappaRTr(i,j,k) = KappaRTr(i,j,k)
     &          + diffKrNrS(k)
          ENDDO
         ENDDO
        ENDDO
       ELSE
        WRITE(msgBuf,'(A,I4)')
     &       ' CALC_3D_DIFFUSIVITY: Invalid tracer Id: ',trIdentity
        CALL PRINT_ERROR(msgBuf, myThid)
        STOP 'ABNORMAL END: S/R CALC_3D_DIFFUSIVITY'
       ENDIF
      ENDIF
      IF (trUseGMRedi) THEN
         CALL GMREDI_CALC_DIFF(
     I        bi,bj,iMin,iMax,jMin,jMax,0,Nr,
     U        KappaRTr,
     I        trIdentity,myThid)
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CALC_BUOYANCY(
     I      bi, bj, iMin, iMax, jMin, jMax,  k, rhoLoc,
     O      buoy,
     I      myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER bi,bj,iMin,iMax,jMin,jMax
      INTEGER k
      Real*8 rhoLoc(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 buoy  (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      INTEGER myThid
      INTEGER i,j
      IF    ( buoyancyRelation .EQ. 'ATMOSPHERIC'  ) THEN
       DO j=jMin,jMax
        DO i=iMin,iMax
         buoy(i,j)=(theta(i,j,k,bi,bj)-tRef(k))/tRef(k)
        ENDDO
       ENDDO
      ELSEIF ( buoyancyRelation .EQ. 'OCEANIC' ) THEN
       DO j=jMin,jMax
        DO i=iMin,iMax
         buoy(i,j)=-gravity*recip_rhoConst*rholoc(i,j)
        ENDDO
       ENDDO
      ELSEIF ( buoyancyRelation .EQ. 'OCEANICP' ) THEN
       DO j=jMin,jMax
        DO i=iMin,iMax
         if ( rholoc(i,j) .ne. 0. ) then
          rholoc(i,j) = 1./rholoc(i,j)
          buoy(i,j)=rholoc(i,j)
         endif
        ENDDO
       ENDDO
      ELSE
       STOP
     &'CALC_BUOANCY: variable "buoyancyRelation" has an illegal value'
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CALC_COMMON_FACTORS(
     I                uVel, vVel,
     O                uFld, vFld, uTrans, vTrans, xA, yA,
     I                k,bi,bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 uVel  (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      Real*8 vVel  (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      Real*8 uFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 xA    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 yA    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER k,bi,bj
      INTEGER myThid
      INTEGER i,j
      DO j=1-OLy,sNy+OLy
       DO i=1-OLx,sNx+OLx
         xA(i,j) = dyG(i,j,bi,bj)*deepFacC(k)
     &           *drF(k)*hFacW(i,j,k,bi,bj)
         yA(i,j) = dxG(i,j,bi,bj)*deepFacC(k)
     &           *drF(k)*hFacS(i,j,k,bi,bj)
       ENDDO
      ENDDO
      DO j=1-OLy,sNy+OLy
       DO i=1-OLx,sNx+OLx
         uFld(i,j) = uVel(i,j,k,bi,bj)
         vFld(i,j) = vVel(i,j,k,bi,bj)
       ENDDO
      ENDDO
      DO j=1-OLy,sNy+OLy
       DO i=1-OLx,sNx+OLx
         uTrans(i,j) = uFld(i,j)*xA(i,j)*rhoFacC(k)
         vTrans(i,j) = vFld(i,j)*yA(i,j)*rhoFacC(k)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CALC_DIFFUSIVITY(
     I        bi,bj,iMin,iMax,jMin,jMax,k,
     I        maskUp,
     O        KappaRT,KappaRS,
     I        myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER bi,bj,iMin,iMax,jMin,jMax,K
      Real*8 maskUp(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 KappaRT(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 KappaRS(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      INTEGER myThid
      INTEGER i,j
      Real*8 KbryanLewis79
      IF ( .NOT. UseKPP ) THEN
       KbryanLewis79=diffKrBL79surf+(diffKrBL79deep-diffKrBL79surf)
     &      *(atan(-(rF(k)-diffKrBL79Ho)/diffKrBL79scl)/PI+0.5d0)
       DO j = 1-Oly, sNy+Oly
        DO i = 1-Olx, sNx+Olx
         KappaRT(i,j) =
     &        IVDConvCount(i,j,k,bi,bj)*ivdc_kappa
     &        + diffKrNrT(k)
     &        + KbryanLewis79
        ENDDO
       ENDDO
       DO j = 1-Oly, sNy+Oly
        DO i = 1-Olx, sNx+Olx
         KappaRS(i,j) =
     &        IVDConvCount(i,j,k,bi,bj)*ivdc_kappa
     &        + diffKrNrS(k)
     &        + KbryanLewis79
        ENDDO
       ENDDO
      ENDIF
      IF (useGMRedi) THEN
         CALL GMREDI_CALC_DIFF(
     I        bi,bj,iMin,iMax,jMin,jMax,k,1,
     U        KappaRT,
     I        GAD_TEMPERATURE,myThid)
         CALL GMREDI_CALC_DIFF(
     I        bi,bj,iMin,iMax,jMin,jMax,k,1,
     U        KappaRS,
     I        GAD_SALINITY,myThid)
      ENDIF
      DO j = 1-Oly, sNy+Oly
       DO i = 1-Olx, sNx+Olx
        KappaRT(i,j) = maskUp(i,j)*KappaRT(i,j)
        KappaRS(i,j) = maskUp(i,j)*KappaRS(i,j)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CALC_DIV_GHAT(
     I                bi,bj,k,
     U                cg2d_b, cg3d_b,
     I                myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER bi,bj
      INTEGER k
      Real*8 cg2d_b(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 cg3d_b(1)
      INTEGER myThid
      INTEGER i,j
      Real*8 xA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 yA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 pf (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      DO j=1,sNy+1
        DO i=1,sNx+1
          xA(i,j) = dyG(i,j,bi,bj)*deepFacC(k)
     &              *drF(k)*hFacW(i,j,k,bi,bj)*rhoFacC(k)
          yA(i,j) = dxG(i,j,bi,bj)*deepFacC(k)
     &              *drF(k)*hFacS(i,j,k,bi,bj)*rhoFacC(k)
        ENDDO
      ENDDO
      IF (implicDiv2Dflow.EQ.1.) THEN
        DO j=1,sNy
         DO i=1,sNx+1
          pf(i,j) = xA(i,j)*gU(i,j,k,bi,bj) / deltaTmom
         ENDDO
        ENDDO
      ELSEIF (exactConserv) THEN
        DO j=1,sNy
         DO i=1,sNx+1
          pf(i,j) = implicDiv2Dflow
     &             *xA(i,j)*gU(i,j,k,bi,bj) / deltaTmom
         ENDDO
        ENDDO
      ELSE
        DO j=1,sNy
         DO i=1,sNx+1
          pf(i,j) = ( implicDiv2Dflow * gU(i,j,k,bi,bj)
     &     + (1.d0-implicDiv2Dflow)* uVel(i,j,k,bi,bj)
     &               ) * xA(i,j) / deltaTmom
         ENDDO
        ENDDO
      ENDIF
      DO j=1,sNy
       DO i=1,sNx
        cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj) +
     &   pf(i+1,j)-pf(i,j)
       ENDDO
      ENDDO
      IF (implicDiv2Dflow.EQ.1.) THEN
        DO j=1,sNy+1
         DO i=1,sNx
          pf(i,j) = yA(i,j)*gV(i,j,k,bi,bj) / deltatmom
         ENDDO
        ENDDO
      ELSEIF (exactConserv) THEN
        DO j=1,sNy+1
         DO i=1,sNx
          pf(i,j) = implicDiv2Dflow
     &             *yA(i,j)*gV(i,j,k,bi,bj) / deltatmom
         ENDDO
        ENDDO
      ELSE
        DO j=1,sNy+1
         DO i=1,sNx
          pf(i,j) = ( implicDiv2Dflow * gV(i,j,k,bi,bj)
     &     + (1.d0-implicDiv2Dflow)* vVel(i,j,k,bi,bj)
     &               ) * yA(i,j) / deltaTmom
         ENDDO
        ENDDO
      ENDIF
      DO j=1,sNy
       DO i=1,sNx
        cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj) +
     &   pf(i,j+1)-pf(i,j)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CALC_GRAD_PHI_HYD(
     I                       k, bi, bj, iMin,iMax, jMin,jMax,
     I                       phiHydC, alphRho, tFld, sFld,
     O                       dPhiHydX, dPhiHydY,
     I                       myTime, myIter, myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER k, bi,bj, iMin,iMax, jMin,jMax
      Real*8 phiHydC(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 alphRho(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 sFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 dPhiHydX(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 dPhiHydY(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 myTime
      INTEGER myIter, myThid
      INTEGER i,j
      Real*8 varLoc(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      IF (.TRUE.) THEN
       DO j=jMin,jMax
        DO i=iMin,iMax
         varLoc(i,j) = phiHydC(i,j)+phi0surf(i,j,bi,bj)
        ENDDO
       ENDDO
      ENDIF
      DO j=1-OLy,sNy+OLy
       DO i=1-OLx,sNx+OLx
        dPhiHydX(i,j)  = 0.d0
        dPhiHydY(i,j)  = 0.d0
       ENDDO
      ENDDO
      DO j=jMin,jMax
       DO i=iMin+1,iMax
        dPhiHydX(i,j) = recip_dxC(i,j,bi,bj)*recip_deepFacC(k)
     &                *( varLoc(i,j)-varLoc(i-1,j) )*recip_rhoFacC(k)
       ENDDO
      ENDDO
      DO j=jMin+1,jMax
       DO i=iMin,iMax
        dPhiHydY(i,j) = recip_dyC(i,j,bi,bj)*recip_deepFacC(k)
     &                *( varLoc(i,j)-varLoc(i,j-1) )*recip_rhoFacC(k)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CALC_GRAD_PHI_SURF( bi, bj, iMin, iMax, jMin, jMax,
     I                       etaFld,
     O                       phiSurfX, phiSurfY,
     I                       myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,iMin,iMax,jMin,jMax
      Real*8 etaFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 phiSurfX(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 phiSurfY(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      INTEGER myThid
      INTEGER i,j
      DO j=jMin,jMax
       DO i=iMin,iMax
        phiSurfX(i,j)=recip_dxC(i,j,bi,bj)*
     &   ( Bo_surf(i,j,bi,bj)*etaFld(i,j,bi,bj)
     &   - Bo_surf(i-1,j,bi,bj)*etaFld(i-1,j,bi,bj) )      
       ENDDO
      ENDDO
      DO j=jMin,jMax
       DO i=iMin,iMax
        phiSurfY(i,j)=recip_dyC(i,j,bi,bj)*
     &   ( Bo_surf(i,j,bi,bj)*etaFld(i,j,bi,bj)
     &   - Bo_surf(i,j-1,bi,bj)*etaFld(i,j-1,bi,bj) ) 
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CALC_GS(
     I           bi,bj,iMin,iMax,jMin,jMax,k,kM1,kUp,kDown,
     I           xA, yA, maskUp, uFld, vFld, wFld,
     I           uTrans, vTrans, rTrans, rTransKp1,
     I           KappaRS,
     U           fVerS,
     I           myTime,myIter,myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
      INTEGER maxNoChkptLev
      PARAMETER ( maxNoChkptLev = 2 )
      COMMON / RESTART_I /
     &  nCheckLev,
     &  tempStartAB, saltStartAB,
     &  mom_StartAB, nHydStartAB,
     &  dPhiNHstatus
      INTEGER nCheckLev
      INTEGER tempStartAB
      INTEGER saltStartAB
      INTEGER mom_StartAB
      INTEGER nHydStartAB
      INTEGER dPhiNHstatus
      COMMON / RESTART_C /
     &  checkPtSuff
      CHARACTER*(5) checkPtSuff(maxNoChkptLev)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      INTEGER bi,bj,iMin,iMax,jMin,jMax
      INTEGER k,kUp,kDown,kM1
      Real*8 xA     (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 yA     (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 maskUp (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uFld   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 wFld   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rTransKp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 KappaRS(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 fVerS  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
      Real*8     myTime
      INTEGER myIter
      INTEGER myThid
      LOGICAL calcAdvection
      INTEGER iterNb
          act1 = bi - myBxLo(myThid)
          max1 = myBxHi(myThid) - myBxLo(myThid) + 1
          act2 = bj - myByLo(myThid)
          max2 = myByHi(myThid) - myByLo(myThid) + 1
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = ikey_dynamics - 1
          itdkey = (act1 + 1) + act2*max1
     &                      + act3*max1*max2
     &                      + act4*max1*max2*max3
          kkey = (itdkey-1)*Nr + k
      fVerS(1,1,kDown) = fVerS(1,1,kDown)
      calcAdvection = saltAdvection .AND. .NOT.saltMultiDimAdvec
      iterNb = myIter
      IF (staggerTimeStep) iterNb = myIter - 1
        CALL GAD_CALC_RHS(
     I           bi,bj,iMin,iMax,jMin,jMax,k,kM1,kUp,kDown,
     I           xA, yA, maskUp, uFld, vFld, wFld,
     I           uTrans, vTrans, rTrans, rTransKp1,
     I           diffKhS, diffK4S, KappaRS, gsNm1, salt, dTtracerLev,
     I           GAD_SALINITY, saltAdvScheme, saltVertAdvScheme,
     I           calcAdvection, saltImplVertAdv, AdamsBashforth_S,
     I           useGMRedi, useKPP,
     U           fVerS, gS,
     I           myTime, myIter, myThid )
      IF ( saltForcing .AND. tracForcingOutAB.NE.1 )
     & CALL EXTERNAL_FORCING_S(
     I     iMin,iMax,jMin,jMax,bi,bj,k,
     I     myTime,myThid)
      IF ( AdamsBashforthGs ) THEN
        CALL ADAMS_BASHFORTH2(
     I                        bi, bj, k,
     U                        gS, gsNm1,
     I                        saltStartAB, iterNb, myThid )
      ENDIF
      IF ( saltForcing .AND. tracForcingOutAB.EQ.1 )
     & CALL EXTERNAL_FORCING_S(
     I     iMin,iMax,jMin,jMax,bi,bj,k,
     I     myTime,myThid)
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CALC_GT(
     I           bi,bj,iMin,iMax,jMin,jMax,k,kM1,kUp,kDown,
     I           xA, yA, maskUp, uFld, vFld, wFld,
     I           uTrans, vTrans, rTrans, rTransKp1,
     I           KappaRT,
     U           fVerT,
     I           myTime,myIter,myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
      INTEGER maxNoChkptLev
      PARAMETER ( maxNoChkptLev = 2 )
      COMMON / RESTART_I /
     &  nCheckLev,
     &  tempStartAB, saltStartAB,
     &  mom_StartAB, nHydStartAB,
     &  dPhiNHstatus
      INTEGER nCheckLev
      INTEGER tempStartAB
      INTEGER saltStartAB
      INTEGER mom_StartAB
      INTEGER nHydStartAB
      INTEGER dPhiNHstatus
      COMMON / RESTART_C /
     &  checkPtSuff
      CHARACTER*(5) checkPtSuff(maxNoChkptLev)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      INTEGER bi,bj,iMin,iMax,jMin,jMax
      INTEGER k,kUp,kDown,kM1
      Real*8 xA     (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 yA     (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 maskUp (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uFld   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 wFld   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rTransKp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 KappaRT(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 fVerT  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
      Real*8     myTime
      INTEGER myIter
      INTEGER myThid
      LOGICAL calcAdvection
      INTEGER iterNb
          act1 = bi - myBxLo(myThid)
          max1 = myBxHi(myThid) - myBxLo(myThid) + 1
          act2 = bj - myByLo(myThid)
          max2 = myByHi(myThid) - myByLo(myThid) + 1
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = ikey_dynamics - 1
          itdkey = (act1 + 1) + act2*max1
     &                      + act3*max1*max2
     &                      + act4*max1*max2*max3
          kkey = (itdkey-1)*Nr + k
      fVerT(1,1,kDown) = fVerT(1,1,kDown)
      calcAdvection = tempAdvection .AND. .NOT.tempMultiDimAdvec
      iterNb = myIter
      IF (staggerTimeStep) iterNb = myIter -1
        CALL GAD_CALC_RHS(
     I           bi,bj,iMin,iMax,jMin,jMax,k,kM1,kUp,kDown,
     I           xA, yA, maskUp, uFld, vFld, wFld,
     I           uTrans, vTrans, rTrans, rTransKp1,
     I           diffKhT, diffK4T, KappaRT, gtNm1, theta, dTtracerLev,
     I           GAD_TEMPERATURE, tempAdvScheme, tempVertAdvScheme,
     I           calcAdvection, tempImplVertAdv, AdamsBashforth_T,
     I           useGMRedi, useKPP,
     U           fVerT, gT,
     I           myTime, myIter, myThid )
      IF ( tempForcing .AND. tracForcingOutAB.NE.1 )
     & CALL EXTERNAL_FORCING_T(
     I     iMin,iMax,jMin,jMax,bi,bj,k,
     I     myTime,myThid)
      IF ( AdamsBashforthGt ) THEN
        CALL ADAMS_BASHFORTH2(
     I                        bi, bj, k,
     U                        gT, gtNm1,
     I                        tempStartAB, iterNb, myThid )
      ENDIF
      IF ( tempForcing .AND. tracForcingOutAB.EQ.1 )
     & CALL EXTERNAL_FORCING_T(
     I     iMin,iMax,jMin,jMax,bi,bj,k,
     I     myTime,myThid)
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CALC_IVDC( 
     I       bi, bj, iMin, iMax, jMin, jMax, K,
     I       rhoKm1, rhoKp1,
     I       myTime,myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,iMin,iMax,jMin,jMax,K
      Real*8 rhoKm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rhoKp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      INTEGER i,j
       DO j=jMin,jmax
        DO i=iMin,imax
         IF ( hFacC(i,j,k,bi,bj) .GT. 0. .AND.
     &        (rhokm1(i,j)-rhokp1(i,j))*rkSign*gravitySign.GT.0. ) THEN
          IVDConvCount(i,j,k,bi,bj) = 1.d0
         ELSE
          IVDConvCount(i,j,k,bi,bj) = 0.d0
         ENDIF
        ENDDO
       ENDDO
       
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CALC_PHI_HYD(
     I                         bi, bj, iMin, iMax, jMin, jMax, k,
     I                         tFld, sFld,
     U                         phiHydF,
     O                         phiHydC, dPhiHydX, dPhiHydY,
     I                         myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER bi,bj,iMin,iMax,jMin,jMax,k
      Real*8 tFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 sFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydF(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 phiHydC(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 dPhiHydX(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 dPhiHydY(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 myTime
      INTEGER myIter, myThid
      INTEGER i,j
      Real*8 zero, one, half
      Real*8 alphaRho(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 dRlocM,dRlocP, ddRloc, locAlpha
      Real*8 ddPIm, ddPIp, rec_dRm, rec_dRp
      Real*8 surfPhiFac
      PARAMETER ( zero= 0.d0 , one= 1.d0 , half= .5d0 )
      LOGICAL useDiagPhiRlow, addSurfPhiAnom
      useDiagPhiRlow = .TRUE.
      addSurfPhiAnom = select_rStar.EQ.0 .AND. nonlinFreeSurf.GT.3
      surfPhiFac = 0.
      IF (addSurfPhiAnom) surfPhiFac = 1.
          act1 = bi - myBxLo(myThid)
          max1 = myBxHi(myThid) - myBxLo(myThid) + 1
          act2 = bj - myByLo(myThid)
          max2 = myByHi(myThid) - myByLo(myThid) + 1
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = ikey_dynamics - 1
          ikey = (act1 + 1) + act2*max1
     &                      + act3*max1*max2
     &                      + act4*max1*max2*max3
      IF (k.EQ.1) THEN
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
           phiHydF(i,j) = 0.
         ENDDO
        ENDDO
      ENDIF
      IF ( buoyancyRelation .EQ. 'OCEANIC' ) THEN
CADJ GENERAL
        IF ( implicitIntGravWave .OR. myIter.LT.0 ) THEN
          kkey = (ikey-1)*Nr + k
CADJ STORE tFld (:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte,
CADJ &     kind = isbyte
CADJ STORE sFld (:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte,
CADJ &     kind = isbyte
          CALL FIND_RHO_2D(
     I              iMin, iMax, jMin, jMax, k,
     I              tFld(1-OLx,1-OLy,k,bi,bj),
     I              sFld(1-OLx,1-OLy,k,bi,bj),
     O              alphaRho,
     I              k, bi, bj, myThid )
        ELSE
          DO j=jMin,jMax
           DO i=iMin,iMax
             alphaRho(i,j) = rhoInSitu(i,j,k,bi,bj)
           ENDDO
          ENDDO
        ENDIF
        IF (quasiHydrostatic) THEN
         CALL MOM_QUASIHYDROSTATIC(bi,bj,k,uVel,vVel,alphaRho,myThid)
        ENDIF
       IF (integr_GeoPot.EQ.1) THEN
         DO j=jMin,jMax
          DO i=iMin,iMax
C
           phiHydC(i,j)=phiHydF(i,j)
     &       + half*drF(k)*gravity*alphaRho(i,j)*recip_rhoConst
           phiHydF(i,j)=phiHydF(i,j)
     &            + drF(k)*gravity*alphaRho(i,j)*recip_rhoConst
          ENDDO
         ENDDO
       ELSE
         dRlocM=half*drC(k)
         IF (k.EQ.1) dRlocM=rF(k)-rC(k)
         IF (k.EQ.Nr) THEN
           dRlocP=rC(k)-rF(k+1)
         ELSE
           dRlocP=half*drC(k+1)
         ENDIF
         DO j=jMin,jMax
          DO i=iMin,iMax
C
            phiHydC(i,j)=phiHydF(i,j)
     &        +dRlocM*gravity*alphaRho(i,j)*recip_rhoConst
            phiHydF(i,j)=phiHydC(i,j)
     &        +dRlocP*gravity*alphaRho(i,j)*recip_rhoConst
          ENDDO
         ENDDO
       ENDIF
      ELSEIF ( buoyancyRelation .EQ. 'OCEANICP' ) THEN
CADJ GENERAL
        IF ( implicitIntGravWave .OR. myIter.LT.0 ) THEN
          kkey = (ikey-1)*Nr + k
CADJ STORE tFld (:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte,
CADJ &     kind = isbyte
CADJ STORE sFld (:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte,
CADJ &     kind = isbyte
          CALL FIND_RHO_2D(
     I              iMin, iMax, jMin, jMax, k,
     I              tFld(1-OLx,1-OLy,k,bi,bj),
     I              sFld(1-OLx,1-OLy,k,bi,bj),
     O              alphaRho,
     I              k, bi, bj, myThid )
CADJ STORE alphaRho (:,:) = comlev1_bibj_k, key=kkey, byte=isbyte,
CADJ &     kind = isbyte
        ELSE
          DO j=jMin,jMax
           DO i=iMin,iMax
             alphaRho(i,j) = rhoInSitu(i,j,k,bi,bj)
           ENDDO
          ENDDO
        ENDIF
        DO j=jMin,jMax
          DO i=iMin,iMax
            locAlpha=alphaRho(i,j)+rhoConst
            alphaRho(i,j)=maskC(i,j,k,bi,bj)*
     &              (one/locAlpha - recip_rhoConst)
          ENDDO
        ENDDO
       IF (integr_GeoPot.EQ.1) THEN
         DO j=jMin,jMax
          DO i=iMin,iMax
C
           IF (k.EQ.kSurfC(i,j,bi,bj)) THEN
             ddRloc = Ro_surf(i,j,bi,bj)-rC(k)
             phiHydC(i,j) = ddRloc*alphaRho(i,j)
           ELSE
             phiHydC(i,j) = phiHydF(i,j) + half*drF(k)*alphaRho(i,j)
           ENDIF
             phiHydF(i,j) = phiHydC(i,j) + half*drF(k)*alphaRho(i,j)
          ENDDO
         ENDDO
       ELSE
         dRlocM=half*drC(k)
         IF (k.EQ.1) dRlocM=rF(k)-rC(k)
         IF (k.EQ.Nr) THEN
           dRlocP=rC(k)-rF(k+1)
         ELSE
           dRlocP=half*drC(k+1)
         ENDIF
         rec_dRm = one/(rF(k)-rC(k))
         rec_dRp = one/(rC(k)-rF(k+1))
         DO j=jMin,jMax
          DO i=iMin,iMax
           IF (k.EQ.kSurfC(i,j,bi,bj)) THEN
             ddRloc = Ro_surf(i,j,bi,bj)-rC(k)
             phiHydC(i,j) =( MAX(zero,ddRloc)*rec_dRm*dRlocM
     &                      +MIN(zero,ddRloc)*rec_dRp*dRlocP
     &                     )*alphaRho(i,j)
           ELSE
             phiHydC(i,j) = phiHydF(i,j) + dRlocM*alphaRho(i,j)
           ENDIF
             phiHydF(i,j) = phiHydC(i,j) + dRlocP*alphaRho(i,j)
          ENDDO
         ENDDO
       ENDIF
      ELSEIF ( buoyancyRelation .EQ. 'ATMOSPHERIC' ) THEN
        DO j=jMin,jMax
         DO i=iMin,iMax
          alphaRho(i,j)=maskC(i,j,k,bi,bj)
     &             *( tFld(i,j,k,bi,bj)*(sFld(i,j,k,bi,bj)*atm_Rq+one)
     &               -tRef(k) )
         ENDDO
        ENDDO
       IF (integr_GeoPot.EQ.0) THEN
         IF (k.EQ.1) THEN
           ddPIm=atm_Cp*( ((rF( k )/atm_Po)**atm_kappa)
     &                   -((rC( k )/atm_Po)**atm_kappa) )
         ELSE
           ddPIm=atm_Cp*( ((rC(k-1)/atm_Po)**atm_kappa)
     &                   -((rC( k )/atm_Po)**atm_kappa) )*half
         ENDIF
         IF (k.EQ.Nr) THEN
           ddPIp=atm_Cp*( ((rC( k )/atm_Po)**atm_kappa)
     &                   -((rF(k+1)/atm_Po)**atm_kappa) )
         ELSE
           ddPIp=atm_Cp*( ((rC( k )/atm_Po)**atm_kappa)
     &                   -((rC(k+1)/atm_Po)**atm_kappa) )*half
         ENDIF
         DO j=jMin,jMax
          DO i=iMin,iMax
             phiHydC(i,j) = phiHydF(i,j) +ddPIm*alphaRho(i,j)
             phiHydF(i,j) = phiHydC(i,j) +ddPIp*alphaRho(i,j)
          ENDDO
         ENDDO
       ELSEIF (integr_GeoPot.EQ.1) THEN
           ddPIm=atm_Cp*( ((rF( k )/atm_Po)**atm_kappa)
     &                   -((rC( k )/atm_Po)**atm_kappa) )
           ddPIp=atm_Cp*( ((rC( k )/atm_Po)**atm_kappa)
     &                   -((rF(k+1)/atm_Po)**atm_kappa) )
         DO j=jMin,jMax
          DO i=iMin,iMax
           IF (k.EQ.kSurfC(i,j,bi,bj)) THEN
             ddRloc = Ro_surf(i,j,bi,bj)-rC(k)
             phiHydC(i,j) = ddRloc*recip_drF(k)*2.d0
     &          *ddPIm*alphaRho(i,j)
           ELSE
             phiHydC(i,j) = phiHydF(i,j) +ddPIm*alphaRho(i,j)
           ENDIF
             phiHydF(i,j) = phiHydC(i,j) +ddPIp*alphaRho(i,j)
          ENDDO
         ENDDO
       ELSEIF ( integr_GeoPot.EQ.2
     &     .OR. integr_GeoPot.EQ.3 ) THEN
         IF (k.EQ.1) THEN
           ddPIm=atm_Cp*( ((rF( k )/atm_Po)**atm_kappa)
     &                   -((rC( k )/atm_Po)**atm_kappa) )
         ELSE
           ddPIm=atm_Cp*( ((rC(k-1)/atm_Po)**atm_kappa)
     &                   -((rC( k )/atm_Po)**atm_kappa) )*half
         ENDIF
         IF (k.EQ.Nr) THEN
           ddPIp=atm_Cp*( ((rC( k )/atm_Po)**atm_kappa)
     &                   -((rF(k+1)/atm_Po)**atm_kappa) )
         ELSE
           ddPIp=atm_Cp*( ((rC( k )/atm_Po)**atm_kappa)
     &                   -((rC(k+1)/atm_Po)**atm_kappa) )*half
         ENDIF
         rec_dRm = one/(rF(k)-rC(k))
         rec_dRp = one/(rC(k)-rF(k+1))
         DO j=jMin,jMax
          DO i=iMin,iMax
           IF (k.EQ.kSurfC(i,j,bi,bj)) THEN
             ddRloc = Ro_surf(i,j,bi,bj)-rC(k)
             phiHydC(i,j) =( MAX(zero,ddRloc)*rec_dRm*ddPIm
     &                      +MIN(zero,ddRloc)*rec_dRp*ddPIp )
     &                    *alphaRho(i,j)
           ELSE
             phiHydC(i,j) = phiHydF(i,j) +ddPIm*alphaRho(i,j)
           ENDIF
             phiHydF(i,j) = phiHydC(i,j) +ddPIp*alphaRho(i,j)
          ENDDO
         ENDDO
       ELSE
         STOP 'CALC_PHI_HYD: Bad integr_GeoPot option !'
       ENDIF
      ELSE
        STOP 'CALC_PHI_HYD: Bad value of buoyancyRelation !'
      ENDIF
      IF (useDiagPhiRlow) THEN
        CALL DIAGS_PHI_RLOW(
     I                      k, bi, bj, iMin,iMax, jMin,jMax,
     I                      phiHydF, phiHydC, alphaRho, tFld, sFld,
     I                      myTime, myIter, myThid)
      ENDIF
        CALL DIAGS_PHI_HYD(
     I                      k, bi, bj, iMin,iMax, jMin,jMax,
     I                      phiHydC,
     I                      myTime, myIter, myThid)
      IF (momPressureForcing) THEN
        CALL CALC_GRAD_PHI_HYD(
     I                         k, bi, bj, iMin,iMax, jMin,jMax,
     I                         phiHydC, alphaRho, tFld, sFld,
     O                         dPhiHydX, dPhiHydY,
     I                         myTime, myIter, myThid)
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CALC_SURF_DR(etaFld,
     I                        myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      Real*8 etaFld(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CALC_VISCOSITY(
     I           bi,bj, iMin,iMax,jMin,jMax,
     O           KappaRU, KappaRV,
     I           myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER iMin,iMax,jMin,jMax
      INTEGER bi,bj
      Real*8 KappaRU(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 KappaRV(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      INTEGER myThid
      INTEGER i,j,k
      DO k = 1,Nr
       DO j = 1-Oly, sNy+Oly
        DO i = 1-Olx, sNx+Olx
         KappaRU(i,j,k) = viscArNr(k)
         KappaRV(i,j,k) = viscArNr(k)
        ENDDO
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CALC_WSURF_TR(thetaFld, saltFld, wVelFld,
     I                         myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      Real*8 thetaFld(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      Real*8 saltFld (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      Real*8 wVelFld (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      INTEGER i,j,bi,bj,ks
      Real*8 wT_Mean, wS_Mean
      Real*8 wT_Tile(nSx,nSy)
      Real*8 wS_Tile(nSx,nSy)
      TsurfCor= 0.
      SsurfCor= 0.
      wT_Mean = 0.
      wS_Mean = 0.
      DO bj=myByLo(myThid), myByHi(myThid)
       DO bi=myBxLo(myThid), myBxHi(myThid)
         wT_Tile(bi,bj) = 0.
         wS_Tile(bi,bj) = 0.
         DO j=1,sNy
          DO i=1,sNx
             ks = ksurfC(i,j,bi,bj)
             IF (ks.LE.Nr) THEN
                wT_Tile(bi,bj) = wT_Tile(bi,bj)
     &           + rA(i,j,bi,bj)*wVelFld(i,j,ks,bi,bj)
     &                          *thetaFld(i,j,ks,bi,bj)
                wS_Tile(bi,bj) = wS_Tile(bi,bj)
     &           + rA(i,j,bi,bj)*wVelFld(i,j,ks,bi,bj)
     &                          *saltFld(i,j,ks,bi,bj)
             ENDIF
          ENDDO
         ENDDO
       ENDDO
      ENDDO
      CALL GLOBAL_SUM_TILE_RL( wT_Tile, wT_Mean, myThid )
      CALL GLOBAL_SUM_TILE_RL( wS_Tile, wS_Mean, myThid )
      IF ( globalArea.GT.0. ) THEN
        IF (  myThid  .EQ. 1 ) THEN
        TsurfCor = wT_Mean / globalArea
        SsurfCor = wS_Mean / globalArea
        ENDIF
      ENDIF
      CALL BARRIER(myThid)
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CG2D_NSA(
     I                cg2d_b,
     U                cg2d_x,
     O                firstResidual,
     O                lastResidual,
     U                numIters,
     I                myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
      COMMON /CG2D_I_L/ cg2dNormaliseRHS
      LOGICAL cg2dNormaliseRHS
      COMMON /CG2D_I_R/
     &      aW2d, aS2d, aC2d,
     &      pW, pS, pC,
     &      cg2dNorm, cg2dTolerance
      Real*8  aW2d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  aS2d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  aC2d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pW   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pC   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  cg2dNorm, cg2dTolerance
      COMMON /CG2D_I_WK_R/
     & cg2d_q, cg2d_r, cg2d_s
      Real*8  cg2d_q(1-1:sNx+1,1-1:sNy+1,nSx,nSy)
      Real*8  cg2d_r(1-1:sNx+1,1-1:sNy+1,nSx,nSy)
      Real*8  cg2d_s(1-1:sNx+1,1-1:sNy+1,nSx,nSy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      Real*8  cg2d_b(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  cg2d_x(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  firstResidual
      Real*8  lastResidual
      INTEGER numIters
      INTEGER myThid
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CONVECTIVE_ADJUSTMENT(
     I                      bi, bj, myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TAVE_TIME/ timeAve_half, timeAve_full
      Real*8 timeAve_half(nSx,nSy)
      Real*8 timeAve_full(nSx,nSy)
      COMMON /TAVE_STATEVARS/
     &                  uFluxtave,vFluxtave,tFluxtave,sFluxtave
     &                 ,etatave,uVeltave,vVeltave,wVeltave
     &                 ,thetatave,salttave,phiHydLowtave
     &                 ,UTtave,VTtave,WTtave,UStave,VStave,WStave
     &                 ,Eta2tave,TTtave,UUtave,VVtave,UVtave
     &                 ,TdiffRtave
     &                 ,uZetatave, vZetatave
     &                 ,phiHydtave
     &                 ,phiHydLow2Tave
     &                 ,ConvectCountTave
      Real*8  uFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  vFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  etatave  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  thetatave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salttave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydLowtave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  UTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  WTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  WStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  eta2Tave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  TTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UUtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VVtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UVtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 TdiffRtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 uZetatave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 vZetatave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydLow2Tave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 ConvectCountTave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      EXTERNAL DIFFERENT_MULTIPLE
      LOGICAL  DIFFERENT_MULTIPLE
      INTEGER bi,bj
      Real*8     myTime
      INTEGER myIter
      INTEGER myThid
      INTEGER iMin,iMax,jMin,jMax
      INTEGER i, j, K, kTop, kBottom, kDir, deltaK
      Real*8 rhoKm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rhoK  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 ConvectCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 weightA(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 weightB(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      IF ( DIFFERENT_MULTIPLE(cAdjFreq,myTime,deltaTClock)
     &   ) THEN
        iMin=1-Olx
        iMax=sNx+Olx
        jMin=1-Oly
        jMax=sNy+Oly
        kTop    = 0
        kBottom = 0
        kDir    = 0
        deltaK  = 0
        DO K=1,Nr
         DO j=1-OLy,sNy+OLy
          DO i=1-OLx,sNx+OLx
           ConvectCount(i,j,K) = 0.
          ENDDO
         ENDDO
        ENDDO
          act1 = bi - myBxLo(myThid)
          max1 = myBxHi(myThid) - myBxLo(myThid) + 1
          act2 = bj - myByLo(myThid)
          max2 = myByHi(myThid) - myByLo(myThid) + 1
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = ikey_dynamics - 1
          ikey = (act1 + 1) + act2*max1
     &                      + act3*max1*max2
     &                      + act4*max1*max2*max3
         IF ( rkSign*gravitySign .GT. 0. ) THEN
          kTop    =  2
          kBottom = Nr
          kDir    =  1
          deltaK  = -1
         ELSE
          kTop    = Nr
          kBottom =  2
          kDir    = -1
          deltaK  =  0
         ENDIF
CADJ STORE theta(:,:,:,bi,bj)  = comlev1_bibj, key=ikey, byte=isbyte,
CADJ &     kind = isbyte
CADJ STORE salt (:,:,:,bi,bj)  = comlev1_bibj, key=ikey, byte=isbyte,
CADJ &     kind = isbyte
CADJ STORE convectcount(:,:,:) = comlev1_bibj, key=ikey, byte=isbyte,
CADJ &     kind = isbyte
          DO K=kTop,kBottom,kDir
            kkey = (ikey-1)*Nr + k
CADJ STORE theta(:,:,k-1,bi,bj) = comlev1_bibj_k,key=kkey,byte=isbyte,
CADJ &     kind = isbyte
CADJ STORE salt (:,:,k-1,bi,bj) = comlev1_bibj_k,key=kkey,byte=isbyte,
CADJ &     kind = isbyte
CADJ STORE convectcount(:,:,k-1) = comlev1_bibj_k,key=kkey,byte=isbyte,
CADJ &     kind = isbyte
            CALL FIND_RHO_2D(
     I           iMin, iMax, jMin, jMax, K+deltaK,
     I           theta(1-OLx,1-OLy,K-1,bi,bj),
     I           salt (1-OLx,1-OLy,K-1,bi,bj),
     O           rhoKm1,
     I           K-1, bi, bj, myThid )
CADJ STORE theta(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte,
CADJ &     kind = isbyte
CADJ STORE salt (:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte,
CADJ &     kind = isbyte
            CALL FIND_RHO_2D(
     I           iMin, iMax, jMin, jMax, K+deltaK,
     I           theta(1-OLx,1-OLy,K,bi,bj),
     I           salt (1-OLx,1-OLy,K,bi,bj),
     O           rhoK,
     I           K, bi, bj, myThid )
CADJ STORE rhoKm1(:,:)  = comlev1_bibj_k, key = kkey, byte = isbyte,
CADJ &     kind = isbyte
CADJ STORE rhoK  (:,:)  = comlev1_bibj_k, key = kkey, byte = isbyte,
CADJ &     kind = isbyte
            CALL CONVECTIVE_WEIGHTS(
     I           bi,bj,K,rhoKm1,rhoK,
     O           weightA,weightB,ConvectCount,
     I           myThid)
            CALL CONVECTIVELY_MIXTRACER(
     I                              bi,bj,k,weightA,weightB,
     U                              theta,
     I                              myThid)
            CALL CONVECTIVELY_MIXTRACER(
     I                              bi,bj,k,weightA,weightB,
     U                              salt,
     I                              myThid)
          ENDDO
          IF (myIter.NE.nIter0 .AND. taveFreq.GT.0.) THEN
            CALL TIMEAVE_CUMUL_1T(ConvectCountTave, ConvectCount,
     I                            Nr, deltaTclock, bi, bj, myThid)
          ENDIF
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CONVECTIVE_ADJUSTMENT_INI(
     I                      bi, bj, myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TAVE_TIME/ timeAve_half, timeAve_full
      Real*8 timeAve_half(nSx,nSy)
      Real*8 timeAve_full(nSx,nSy)
      COMMON /TAVE_STATEVARS/
     &                  uFluxtave,vFluxtave,tFluxtave,sFluxtave
     &                 ,etatave,uVeltave,vVeltave,wVeltave
     &                 ,thetatave,salttave,phiHydLowtave
     &                 ,UTtave,VTtave,WTtave,UStave,VStave,WStave
     &                 ,Eta2tave,TTtave,UUtave,VVtave,UVtave
     &                 ,TdiffRtave
     &                 ,uZetatave, vZetatave
     &                 ,phiHydtave
     &                 ,phiHydLow2Tave
     &                 ,ConvectCountTave
      Real*8  uFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  vFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  etatave  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  thetatave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salttave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydLowtave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  UTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  WTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  WStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  eta2Tave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  TTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UUtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VVtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UVtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 TdiffRtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 uZetatave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 vZetatave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydLow2Tave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 ConvectCountTave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      EXTERNAL DIFFERENT_MULTIPLE
      LOGICAL  DIFFERENT_MULTIPLE
      INTEGER bi,bj
      Real*8     myTime
      INTEGER myIter
      INTEGER myThid
      INTEGER iMin,iMax,jMin,jMax
      INTEGER i, j, K, kTop, kBottom, kDir, deltaK
      Real*8 rhoKm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rhoK  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 ConvectCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 weightA(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 weightB(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      IF ( DIFFERENT_MULTIPLE(cAdjFreq,myTime,deltaTClock)
     &   ) THEN
        iMin=1-Olx
        iMax=sNx+Olx
        jMin=1-Oly
        jMax=sNy+Oly
        kTop    = 0
        kBottom = 0
        kDir    = 0
        deltaK  = 0
        DO K=1,Nr
         DO j=1-OLy,sNy+OLy
          DO i=1-OLx,sNx+OLx
           ConvectCount(i,j,k) = 0.
          ENDDO
         ENDDO
        ENDDO
          act1 = bi - myBxLo(myThid)
          max1 = myBxHi(myThid) - myBxLo(myThid) + 1
          act2 = bj - myByLo(myThid)
          max2 = myByHi(myThid) - myByLo(myThid) + 1
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = 0
          ikey = (act1 + 1) + act2*max1
     &                      + act3*max1*max2
     &                      + act4*max1*max2*max3
         IF ( rkSign*gravitySign .GT. 0. ) THEN
          kTop    =  2
          kBottom = Nr
          kDir    =  1
          deltaK  = -1
         ELSE
          kTop    = Nr
          kBottom =  2
          kDir    = -1
          deltaK  =  0
         ENDIF
CADJ STORE theta(:,:,:,bi,bj)  = tapelev_ini_bibj,
CADJ &     key=ikey, byte=isbyte
CADJ STORE salt (:,:,:,bi,bj)  = tapelev_ini_bibj,
CADJ &     key=ikey, byte=isbyte
CADJ STORE convectcount(:,:,:) = tapelev_ini_bibj,
CADJ &     key=ikey, byte=isbyte
          DO K=kTop,kBottom,kDir
            kkey = (ikey-1)*Nr + k
CADJ STORE theta(:,:,k-1,bi,bj) = tapelev_ini_bibj_k,
CADJ &     key=kkey, byte=isbyte
CADJ STORE salt (:,:,k-1,bi,bj) = tapelev_ini_bibj_k,
CADJ &     key=kkey, byte=isbyte
CADJ STORE convectcount(:,:,k-1) = tapelev_ini_bibj_k,
CADJ &     key=kkey, byte=isbyte
            CALL FIND_RHO_2D(
     I           iMin, iMax, jMin, jMax, K+deltaK,
     I           theta(1-OLx,1-OLy,K-1,bi,bj),
     I           salt (1-OLx,1-OLy,K-1,bi,bj),
     O           rhoKm1,
     I           K-1, bi, bj, myThid )
CADJ STORE theta(:,:,k,bi,bj) = tapelev_ini_bibj_k,
CADJ &     key = kkey, byte = isbyte
CADJ STORE salt (:,:,k,bi,bj) = tapelev_ini_bibj_k,
CADJ &     key = kkey, byte = isbyte
            CALL FIND_RHO_2D(
     I           iMin, iMax, jMin, jMax, K+deltaK,
     I           theta(1-OLx,1-OLy,K,bi,bj),
     I           salt (1-OLx,1-OLy,K,bi,bj),
     O           rhoK,
     I           K, bi, bj, myThid )
CADJ STORE rhoKm1(:,:)  = tapelev_ini_bibj_k, key=kkey, byte=isbyte
CADJ STORE rhoK  (:,:)  = tapelev_ini_bibj_k, key=kkey, byte=isbyte
            CALL CONVECTIVE_WEIGHTS(
     I           bi,bj,K,rhoKm1,rhoK,
     O           weightA,weightB,ConvectCount,
     I           myThid)
            CALL CONVECTIVELY_MIXTRACER(
     I                              bi,bj,k,weightA,weightB,
     U                              theta,
     I                              myThid)
            CALL CONVECTIVELY_MIXTRACER(
     I                              bi,bj,k,weightA,weightB,
     U                              salt,
     I                              myThid)
          ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CONVECTIVE_WEIGHTS(
     I                              bi,bj,k,rhoKm1,rhoK,
     O                              weightA,weightB,ConvectCount,
     I                              myThid)
C
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8 rhoKm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rhoK(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 weightA(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 weightB(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 ConvectCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      INTEGER myThid
      INTEGER i,j
      Real*8 dS,d1,d2
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
         IF ( hFacC(i,j,k-1,bi,bj)
     &       *hFacC(i,j,k,bi,bj) .GT. 0.
     &  .AND. (rhokm1(i,j)-rhok(i,j))*rkSign*gravitySign .GT. 0.
     &      ) THEN
          d1 = hFacC(i,j,k-1,bi,bj)*drF(k-1)
          d2 = hFacC(i,j, k ,bi,bj)*drF( k )
          dS = d1+d2
          weightA(i,j) = d2/dS
          weightB(i,j) = d1/dS
          ConvectCount(i,j,k) = ConvectCount(i,j,k) + 1.
         ELSE
          weightA(i,j) = 0.
          weightB(i,j) = 0.
         ENDIF
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CONVECTIVELY_MIXTRACER(
     I                              bi,bj,k,weightA,weightB,
     U                              Tracer,
     I                              myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER bi,bj,k
      Real*8 weightA(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 weightB(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 Tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      INTEGER i,j
      Real*8 delTrac
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
        delTrac=Tracer(i,j,k,bi,bj)-Tracer(i,j,k-1,bi,bj)
        Tracer(i,j,k-1,bi,bj)=Tracer(i,j,k-1,bi,bj)
     &                       +weightA(i,j)*delTrac
        Tracer(i,j,k,bi,bj)=Tracer(i,j,k,bi,bj)
     &                       -weightB(i,j)*delTrac
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CORRECTION_STEP( bi, bj, iMin, iMax, jMin, jMax,
     I                       k, phiSurfX, phiSurfY,
     I                       myTime, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8     phiSurfX(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8     phiSurfY(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER bi,bj
      INTEGER iMin,iMax,jMin,jMax
      INTEGER k
      Real*8     myTime
      INTEGER myThid
      INTEGER i,j
      Real*8     psFac, nhFac
      psFac = pfFacMom*implicSurfPress
     &       *recip_deepFacC(k)*recip_rhoFacC(k)
      IF ( use3Dsolver ) THEN
        nhFac = pfFacMom*implicitNHPress
     &         *recip_deepFacC(k)*recip_rhoFacC(k)
      ELSE
        nhFac = 0.
      ENDIF
      DO j=jMin,jMax
       DO i=iMin,iMax
        uVel(i,j,k,bi,bj)=( gU(i,j,k,bi,bj)
     &       -deltaTmom*psFac*phiSurfX(i,j)
     &                    )*maskW(i,j,k,bi,bj)
       ENDDO
      ENDDO
      DO j=jMin,jMax
       DO i=iMin,iMax
        vVel(i,j,k,bi,bj)=( gV(i,j,k,bi,bj)
     &       -deltaTmom*psFac*phiSurfY(i,j)
     &                    )*maskS(i,j,k,bi,bj)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CYCLE_TRACER(
     I                   bi, bj,
     U                   tracer, gTracer,
     I                   myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER bi,bj
      Real*8 tracer (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 gTracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 myTime
      INTEGER myIter, myThid
      INTEGER i,j,k
      DO k=1,Nr
       DO j=1-OLy,sNy+OLy
        DO i=1-OLx,sNx+OLx
         tracer(i,j,k,bi,bj)=gTracer(i,j,k,bi,bj)
        ENDDO
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE DIAGS_PHI_HYD( 
     I                       k, bi, bj, iMin,iMax, jMin,jMax,
     I                       phiHydC,
     I                       myTime, myIter, myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER k, bi,bj, iMin,iMax, jMin,jMax
      Real*8 phiHydC(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 myTime
      INTEGER myIter, myThid
      INTEGER i,j
        DO j=jMin,jMax
         DO i=iMin,iMax
           totPhiHyd(i,j,k,bi,bj) = phiHydC(i,j)
     &            + Bo_surf(i,j,bi,bj)*etaN(i,j,bi,bj)
     &            + phi0surf(i,j,bi,bj) 
         ENDDO
        ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE DIAGS_PHI_RLOW(
     I                       k, bi, bj, iMin,iMax, jMin,jMax,
     I                       phiHydF, phiHydC, alphRho, tFld, sFld,
     I                       myTime, myIter, myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER k, bi,bj, iMin,iMax, jMin,jMax
      Real*8 phiHydF(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 phiHydC(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 alphRho(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 tFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 sFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 myTime
      INTEGER myIter, myThid
      INTEGER i,j
      Real*8 zero, one, half
      Real*8 ddRloc, ratioRm, ratioRp
      PARAMETER ( zero= 0.d0 , one= 1.d0 , half= .5d0 )
      IF ( usingZCoords ) THEN
       IF ( k.EQ.1 ) THEN
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
            phiHydLow(i,j,bi,bj) = 0.d0
          ENDDO
         ENDDO
       ENDIF
       IF (integr_GeoPot.EQ.1) THEN
         DO j=jMin,jMax
          DO i=iMin,iMax
           IF ( k .EQ. kLowC(i,j,bi,bj) ) THEN
             ddRloc = rC(k)-R_low(i,j,bi,bj)
             phiHydLow(i,j,bi,bj) = phiHydC(i,j)
     &            + ddRloc*gravity*alphRho(i,j)*recip_rhoConst
           ENDIF
          ENDDO
         ENDDO
       ELSE
         ratioRm = one
         ratioRp = one
         IF (k.GT.1 ) ratioRm = half*drC(k)/(rF(k)-rC(k))
         IF (k.LT.Nr) ratioRp = half*drC(k+1)/(rC(k)-rF(k+1))
         DO j=jMin,jMax
          DO i=iMin,iMax
           IF ( k .EQ. kLowC(i,j,bi,bj) ) THEN
             ddRloc = rC(k)-R_low(i,j,bi,bj)
             phiHydLow(i,j,bi,bj) = phiHydC(i,j)
     &                  +( MIN(zero,ddRloc)*ratioRm
     &                    +MAX(zero,ddRloc)*ratioRp
     &                   )*gravity*alphRho(i,j)*recip_rhoConst
           ENDIF
          ENDDO
         ENDDO
       ENDIF
      ENDIF
      IF ( k.EQ.Nr ) THEN
       IF ( usingPCoords ) THEN
        DO j=jMin,jMax
         DO i=iMin,iMax
           phiHydLow(i,j,bi,bj) = phiHydF(i,j)
         ENDDO
        ENDDO
       ENDIF
        DO j=jMin,jMax
         DO i=iMin,iMax
           phiHydLow(i,j,bi,bj) = phiHydLow(i,j,bi,bj)
     &            + Bo_surf(i,j,bi,bj)*etaN(i,j,bi,bj)
     &            + phi0surf(i,j,bi,bj)
         ENDDO
        ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE DIAGS_RHO_L( 
     I                        k, bi, bj,
     I                        rhoK, rhoKm1, wFld,
     I                        myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER k, bi, bj
      Real*8 rhoK  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rhoKm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 wFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 myTime
      INTEGER myIter, myThid
      RETURN
      END
      SUBROUTINE DIAGS_RHO_G( 
     I                        rho3d, uFld, vFld,
     I                        myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rho3d(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 uFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 vFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 myTime
      INTEGER myIter, myThid
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE DO_ATMOSPHERIC_PHYS(myTime, myIter, myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      IF ( debugLevel.GE.debLevB )
     &  CALL DEBUG_ENTER('DO_ATMOSPHERIC_PHYS',myThid)
      IF ( debugLevel .GE. debLevB )
     &  CALL DEBUG_LEAVE('DO_ATMOSPHERIC_PHYS',myThid)
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE DO_FIELDS_BLOCKING_EXCHANGES(myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      COMMON /DYNVARS_CD/
     &                   uVelD, vVelD,
     &                   etaNm1,
     &                   uNM1,  vNM1
      Real*8  uVelD (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVelD (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  etaNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uNM1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vNM1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      IF ( .NOT.useOffLine ) THEN
      IF ( .NOT.staggerTimeStep .OR. .NOT.useMultiDimAdvec ) THEN
       CALL EXCH_UV_XYZ_RL(uVel,vVel,.TRUE.,myThid)
       IF ( .NOT.implicitIntGravWave )
     & CALL EXCH_XYZ_RL (  wVel ,  myThid  )
      ENDIF
      IF ( .NOT.implicitIntGravWave ) THEN
       CALL EXCH_XYZ_RL (  theta,  myThid  )
       CALL EXCH_XYZ_RL (  salt ,  myThid  )
      ENDIF
      IF ( tempSOM_Advection .OR. saltSOM_Advection )
     &  CALL GAD_SOM_EXCHANGES( myThid )
      CALL EXCH_UV_DGRID_3D_RL( uVelD,vVelD, .TRUE., Nr, myThid )
      IF ( useDynP_inEos_Zc )
     & CALL EXCH_XYZ_RL (  totPhiHyd ,  myThid  )
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
 
      SUBROUTINE DO_OCEANIC_PHYS(myTime, myIter, myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /TAVE_TIME/ timeAve_half, timeAve_full
      Real*8 timeAve_half(nSx,nSy)
      Real*8 timeAve_full(nSx,nSy)
      COMMON /TAVE_STATEVARS/
     &                  uFluxtave,vFluxtave,tFluxtave,sFluxtave
     &                 ,etatave,uVeltave,vVeltave,wVeltave
     &                 ,thetatave,salttave,phiHydLowtave
     &                 ,UTtave,VTtave,WTtave,UStave,VStave,WStave
     &                 ,Eta2tave,TTtave,UUtave,VVtave,UVtave
     &                 ,TdiffRtave
     &                 ,uZetatave, vZetatave
     &                 ,phiHydtave
     &                 ,phiHydLow2Tave
     &                 ,ConvectCountTave
      Real*8  uFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  vFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  etatave  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  thetatave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salttave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydLowtave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  UTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  WTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  WStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  eta2Tave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  TTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UUtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VVtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UVtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 TdiffRtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 uZetatave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 vZetatave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydLow2Tave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 ConvectCountTave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 SItoBar, SItodBar
      PARAMETER ( SItoBar  = 1.D-05 )
      PARAMETER ( SItodBar = 1.D-04 )
      COMMON /PARM_EOS_LIN/ tAlpha,sBeta,equationOfState
      Real*8 tAlpha
      Real*8 sBeta
      character*(6) equationOfState
      COMMON /PARM_EOS_NL/ eosC,eosSig0,eosRefT,eosRefS
      Real*8 eosC(9,Nr+1),eosSig0(Nr+1),eosRefT(Nr+1),eosRefS(Nr+1)
      Real*8 eosJMDCFw(6), eosJMDCSw(9)
      Real*8 eosJMDCKFw(5), eosJMDCKSw(7), eosJMDCKP(14)
      COMMON /PARM_EOS_JMD95/
     &     eosJMDCFw, eosJMDCSw, eosJMDCKFw, eosJMDCKSw, eosJMDCKP
      Real*8 eosMDJWFnum(0:11), eosMDJWFden(0:12)
      COMMON /PARM_EOS_MDJWF/ 
     &     eosMDJWFnum, eosMDJWFden
      Real*8 op5
      Real*8 op25
      PARAMETER( op5  = 0.5 D 0 )
      PARAMETER( op25 = 0.25 D 0 )
      LOGICAL GM_AdvForm
      LOGICAL GM_AdvSeparate
      LOGICAL GM_ExtraDiag
      LOGICAL GM_InMomAsStress
      LOGICAL GM_MNC
      LOGICAL GM_MDSIO
      COMMON /GM_PARAMS_L/
     &                   GM_AdvForm, GM_AdvSeparate,
     &                   GM_ExtraDiag, GM_MNC, GM_MDSIO,
     &                   GM_InMomAsStress
      CHARACTER*(40) GM_taper_scheme
      COMMON /GM_PARAMS_C/
     &                   GM_taper_scheme
      Real*8 GM_isopycK
      Real*8 GM_background_K
      Real*8 GM_maxSlope
      Real*8 GM_Kmin_horiz
      Real*8 GM_Small_Number
      Real*8 GM_slopeSqCutoff
      Real*8 GM_Visbeck_alpha
      Real*8 GM_Visbeck_length
      Real*8 GM_Visbeck_depth
      Real*8 GM_Visbeck_minDepth
      Real*8 GM_Visbeck_maxSlope
      Real*8 GM_Visbeck_minVal_K
      Real*8 GM_Visbeck_maxVal_K
      Real*8 GM_facTrL2dz
      Real*8 GM_facTrL2ML
      Real*8 GM_maxTransLay
      Real*8 GM_Scrit
      Real*8 GM_Sd
      COMMON /GM_PARAMS_R/
     &                   GM_isopycK, GM_background_K,
     &                   GM_maxSlope,
     &                   GM_Kmin_horiz,
     &                   GM_Small_Number, GM_slopeSqCutoff,
     &                   GM_Visbeck_alpha, GM_Visbeck_length,
     &                   GM_Visbeck_depth,
     &                   GM_Visbeck_minDepth, GM_Visbeck_maxSlope,
     &                   GM_Visbeck_minVal_K, GM_Visbeck_maxVal_K,
     &                   GM_facTrL2dz, GM_facTrL2ML, GM_maxTransLay,
     &                   GM_Scrit, GM_Sd
      Real*8 GM_rMaxSlope
      Real*8 GM_skewflx
      Real*8 GM_advect
      COMMON /GM_DERIVED_PAR/
     &                   GM_rMaxSlope,
     &                   GM_skewflx, GM_advect
      Real*8 Kwx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_Wtensor/ Kwx,Kwy,Kwz
      Real*8 Kux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_HorTensor/ Kux,Kvy
      Real*8 Kuz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_UVtensor/ Kuz,Kvz
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      Real*8 rhoKp1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rhoKm1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 sigmaX  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 sigmaY  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      Real*8 sigmaR  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      INTEGER iMin, iMax
      INTEGER jMin, jMax
      INTEGER bi, bj
      INTEGER i, j, k
      INTEGER doDiagsRho
      itdkey = 1
      IF ( debugLevel .GE. debLevB )
     &     CALL DEBUG_ENTER('DO_OCEANIC_PHYS',myThid)
      doDiagsRho = 0
CADJ STORE sst, sss           = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE qsw                = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE theta = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
      IF ( allowFreezing ) THEN
        CALL FREEZE_SURFACE(  myTime, myIter, myThid )
      ENDIF
CHPF$ INDEPENDENT
      DO bj=myByLo(myThid),myByHi(myThid)
CHPF$ INDEPENDENT
       DO bi=myBxLo(myThid),myBxHi(myThid)
          act1 = bi - myBxLo(myThid)
          max1 = myBxHi(myThid) - myBxLo(myThid) + 1
          act2 = bj - myByLo(myThid)
          max2 = myByHi(myThid) - myByLo(myThid) + 1
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = ikey_dynamics - 1
          itdkey = (act1 + 1) + act2*max1
     &                      + act3*max1*max2
     &                      + act4*max1*max2*max3
        DO j=1-OLy,sNy+OLy
         DO i=1-OLx,sNx+OLx
          rhoKm1 (i,j)   = 0.d0
          rhoKp1 (i,j)   = 0.d0
         ENDDO
        ENDDO
        DO k=1,Nr
         DO j=1-OLy,sNy+OLy
          DO i=1-OLx,sNx+OLx
           sigmaX(i,j,k) = 0.d0
           sigmaY(i,j,k) = 0.d0
           sigmaR(i,j,k) = 0.d0
           IVDConvCount(i,j,k,bi,bj) = 0.
           Kwx(i,j,k,bi,bj)  = 0.d0
           Kwy(i,j,k,bi,bj)  = 0.d0
           Kwz(i,j,k,bi,bj)  = 0.d0
           Kux(i,j,k,bi,bj)  = 0.d0
           Kvy(i,j,k,bi,bj)  = 0.d0
           Kuz(i,j,k,bi,bj)  = 0.d0
           Kvz(i,j,k,bi,bj)  = 0.d0
          ENDDO
         ENDDO
        ENDDO
        iMin = 1-OLx
        iMax = sNx+OLx
        jMin = 1-OLy
        jMax = sNy+OLy
CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj, key=itdkey, 
CADJ &     kind = isbyte
CADJ STORE salt (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, 
CADJ &     kind = isbyte
CADJ STORE totphihyd(:,:,:,bi,bj)
CADJ &     = comlev1_bibj, key=itdkey, 
CADJ &     kind = isbyte
        IF ( debugLevel .GE. debLevB )
     &    CALL DEBUG_MSG('ENTERING UPWARD K LOOP',myThid)
        DO k=Nr,1,-1
C? Patrick, is this formula correct now that we change the loop range?
C? Do we still need this?
          kkey = (itdkey-1)*Nr + k
          IF ( debugLevel .GE. debLevB )
     &       CALL DEBUG_CALL('FIND_RHO_2D',myThid)
          IF ( fluidIsWater ) THEN
CADJ STORE theta(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, 
CADJ &     kind = isbyte
CADJ STORE salt(:,:,k,bi,bj)  = comlev1_bibj_k, key=kkey, 
CADJ &     kind = isbyte
            CALL FIND_RHO_2D(
     I                iMin, iMax, jMin, jMax, k,
     I                theta(1-OLx,1-OLy,k,bi,bj),
     I                salt (1-OLx,1-OLy,k,bi,bj),
     O                rhoInSitu(1-OLx,1-OLy,k,bi,bj),
     I                k, bi, bj, myThid )
          ELSE
           DO j=1-OLy,sNy+OLy
            DO i=1-OLx,sNx+OLx
              rhoInSitu(i,j,k,bi,bj) = 0.
            ENDDO
           ENDDO
          ENDIF
          IF ( useGMRedi .OR. (k.GT.1 .AND. ivdc_kappa.NE.0.)
     &         .OR. useSALT_PLUME .OR. doDiagsRho.GE.1 ) THEN
            IF (k.GT.1) THEN
CADJ STORE theta(:,:,k-1,bi,bj) = comlev1_bibj_k, key=kkey, 
CADJ &     kind = isbyte
CADJ STORE salt (:,:,k-1,bi,bj) = comlev1_bibj_k, key=kkey, 
CADJ &     kind = isbyte
CADJ STORE rhokm1 (bi,bj)       = comlev1_bibj_k, key=kkey, 
CADJ &     kind = isbyte
             CALL FIND_RHO_2D(
     I                 iMin, iMax, jMin, jMax, k,
     I                 theta(1-OLx,1-OLy,k-1,bi,bj),
     I                 salt (1-OLx,1-OLy,k-1,bi,bj),
     O                 rhoKm1,
     I                 k-1, bi, bj, myThid )
            ENDIF
            IF ( debugLevel .GE. debLevB )
     &       CALL DEBUG_CALL('GRAD_SIGMA',myThid)
            DO j=jMin,jMax
             DO i=iMin,iMax
              rhoKp1(i,j) = rhoInSitu(i,j,k,bi,bj)
             ENDDO
            ENDDO
            CALL GRAD_SIGMA(
     I             bi, bj, iMin, iMax, jMin, jMax, k,
     I             rhoInSitu(1-OLx,1-OLy,k,bi,bj), rhoKm1, rhoKp1,
     O             sigmaX, sigmaY, sigmaR,
     I             myThid )
          ENDIF
          IF (k.GT.1 .AND. ivdc_kappa.NE.0.) THEN
            IF ( debugLevel .GE. debLevB )
     &       CALL DEBUG_CALL('CALC_IVDC',myThid)
            CALL CALC_IVDC(
     I        bi, bj, iMin, iMax, jMin, jMax, k,
     I        rhoKm1, rhoInSitu(1-OLx,1-OLy,k,bi,bj),
     I        myTime, myIter, myThid)
          ENDIF
        ENDDO
CADJ STORE IVDConvCount(:,:,:,bi,bj)
CADJ &     = comlev1_bibj, key=itdkey, 
CADJ &     kind = isbyte
        IF ( useGMRedi .OR. doDiagsRho.GE.4 ) THEN
          CALL CALC_OCE_MXLAYER(
     I              rhoInSitu(1-OLx,1-OLy,1,bi,bj), sigmaR,
     I              bi, bj, myTime, myIter, myThid )
        ENDIF
        IF ( debugLevel .GE. debLevB )
     &    CALL DEBUG_CALL('EXTERNAL_FORCING_SURF',myThid)
CADJ STORE EmPmR(:,:,bi,bj)
CADJ &     = comlev1_bibj, key=itdkey, 
CADJ &     kind = isbyte
CADJ STORE PmEpR(:,:,bi,bj)
CADJ &     = comlev1_bibj, key=itdkey, 
CADJ &     kind = isbyte
        CALL EXTERNAL_FORCING_SURF(
     I             bi, bj, iMin, iMax, jMin, jMax,
     I             myTime, myIter, myThid )
CADJ STORE surfaceForcingU(:,:,bi,bj)
CADJ &     = comlev1_bibj, key=itdkey, 
CADJ &     kind = isbyte
CADJ STORE surfaceForcingV(:,:,bi,bj)
CADJ &     = comlev1_bibj, key=itdkey, 
CADJ &     kind = isbyte
CADJ STORE surfaceForcingS(:,:,bi,bj)
CADJ &     = comlev1_bibj, key=itdkey, 
CADJ &     kind = isbyte
CADJ STORE surfaceForcingT(:,:,bi,bj)
CADJ &     = comlev1_bibj, key=itdkey, 
CADJ &     kind = isbyte
CADJ STORE surfaceForcingTice(:,:,bi,bj)
CADJ &     = comlev1_bibj, key=itdkey, 
CADJ &     kind = isbyte
        IF ( taveFreq.GT. 0.d0 ) THEN
          CALL TIMEAVE_SURF_FLUX( bi, bj, myTime, myIter, myThid)
        ENDIF
        IF (taveFreq.GT.0. .AND. ivdc_kappa.NE.0.) THEN
          CALL TIMEAVE_CUMULATE(ConvectCountTave, IVDConvCount,
     I                           Nr, deltaTclock, bi, bj, myThid)
        ENDIF
        IF (useGMRedi) THEN
          IF ( debugLevel .GE. debLevB )
     &     CALL DEBUG_CALL('GMREDI_CALC_TENSOR',myThid)
          CALL GMREDI_CALC_TENSOR(
     I             iMin, iMax, jMin, jMax,
     I             sigmaX, sigmaY, sigmaR,
     I             bi, bj, myTime, myIter, myThid )
        ELSE
          CALL GMREDI_CALC_TENSOR_DUMMY(
     I             iMin, iMax, jMin, jMax,
     I             sigmaX, sigmaY, sigmaR,
     I             bi, bj, myTime, myIter, myThid )
        ENDIF
       ENDDO
      ENDDO
      IF ( debugLevel .GE. debLevB )
     &     CALL DEBUG_LEAVE('DO_OCEANIC_PHYS',myThid)
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE DO_STAGGER_FIELDS_EXCHANGES(myTime, myIter, myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid   
      IF ( staggerTimeStep .AND. useMultiDimAdvec) THEN
        CALL EXCH_UV_XYZ_RL(uVel,vVel,.TRUE.,myThid)
        IF ( .NOT.implicitIntGravWave )
     &  CALL EXCH_XYZ_RL (  wVel ,  myThid  )
      ENDIF
      IF ( implicitIntGravWave ) THEN
        CALL EXCH_XYZ_RL (  gT ,  myThid  )
        CALL EXCH_XYZ_RL (  gS ,  myThid  )
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE DYNAMICS(myTime, myIter, myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_CD/
     &                   uVelD, vVelD,
     &                   etaNm1,
     &                   uNM1,  vNM1
      Real*8  uVelD (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVelD (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  etaNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uNM1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vNM1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 SItoBar, SItodBar
      PARAMETER ( SItoBar  = 1.D-05 )
      PARAMETER ( SItodBar = 1.D-04 )
      COMMON /PARM_EOS_LIN/ tAlpha,sBeta,equationOfState
      Real*8 tAlpha
      Real*8 sBeta
      character*(6) equationOfState
      COMMON /PARM_EOS_NL/ eosC,eosSig0,eosRefT,eosRefS
      Real*8 eosC(9,Nr+1),eosSig0(Nr+1),eosRefT(Nr+1),eosRefS(Nr+1)
      Real*8 eosJMDCFw(6), eosJMDCSw(9)
      Real*8 eosJMDCKFw(5), eosJMDCKSw(7), eosJMDCKP(14)
      COMMON /PARM_EOS_JMD95/
     &     eosJMDCFw, eosJMDCSw, eosJMDCKFw, eosJMDCKSw, eosJMDCKP
      Real*8 eosMDJWFnum(0:11), eosMDJWFden(0:12)
      COMMON /PARM_EOS_MDJWF/ 
     &     eosMDJWFnum, eosMDJWFden
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      Real*8 fVerU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
      Real*8 fVerV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
      Real*8 phiHydF (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 phiHydC (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 dPhiHydX(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 dPhiHydY(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 phiSurfX(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 phiSurfY(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 guDissip(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 gvDissip(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 KappaRU (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 KappaRV (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      INTEGER iMin, iMax
      INTEGER jMin, jMax
      INTEGER bi, bj
      INTEGER i, j
      INTEGER k, km1, kp1, kup, kDown
C
C
C
      IF ( debugLevel .GE. debLevB )
     &   CALL DEBUG_ENTER( 'DYNAMICS', myThid )
CHPF$ INDEPENDENT
      DO bj=myByLo(myThid),myByHi(myThid)
CHPF$  INDEPENDENT, NEW (fVerU,fVerV
CHPF$&                  ,phiHydF
CHPF$&                  ,KappaRU,KappaRV
CHPF$&                  )
       DO bi=myBxLo(myThid),myBxHi(myThid)
          act1 = bi - myBxLo(myThid)
          max1 = myBxHi(myThid) - myBxLo(myThid) + 1
          act2 = bj - myByLo(myThid)
          max2 = myByHi(myThid) - myByLo(myThid) + 1
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = ikey_dynamics - 1
          idynkey = (act1 + 1) + act2*max1
     &                      + act3*max1*max2
     &                      + act4*max1*max2*max3
        DO k=1,Nr
         DO j=1-OLy,sNy+OLy
          DO i=1-OLx,sNx+OLx
           KappaRU(i,j,k) = 0.d0
           KappaRV(i,j,k) = 0.d0
           gU(i,j,k,bi,bj) = 0.d0
           gV(i,j,k,bi,bj) = 0.d0
          ENDDO
         ENDDO
        ENDDO
        DO j=1-OLy,sNy+OLy
         DO i=1-OLx,sNx+OLx
          fVerU  (i,j,1) = 0.d0
          fVerU  (i,j,2) = 0.d0
          fVerV  (i,j,1) = 0.d0
          fVerV  (i,j,2) = 0.d0
          phiHydF (i,j)  = 0.d0
          phiHydC (i,j)  = 0.d0
          phiSurfX(i,j)  = 0.d0
          phiSurfY(i,j)  = 0.d0
          guDissip(i,j)  = 0.d0
          gvDissip(i,j)  = 0.d0
          phiHydLow(i,j,bi,bj) = 0.d0
         ENDDO
        ENDDO
        iMin = 0
        iMax = sNx+1
        jMin = 0
        jMax = sNy+1
CADJ STORE wvel (:,:,:,bi,bj) =
CADJ &     comlev1_bibj, key=idynkey, byte=isbyte
        IF (implicSurfPress.NE.1.) THEN
          CALL CALC_GRAD_PHI_SURF(
     I         bi,bj,iMin,iMax,jMin,jMax,
     I         etaN,
     O         phiSurfX,phiSurfY,
     I         myThid )
        ENDIF
CADJ STORE uvel (:,:,:,bi,bj) = comlev1_bibj, key=idynkey, byte=isbyte
CADJ STORE vvel (:,:,:,bi,bj) = comlev1_bibj, key=idynkey, byte=isbyte
        CALL CALC_VISCOSITY(
     I            bi,bj, iMin,iMax,jMin,jMax,
     O            KappaRU, KappaRV,
     I            myThid )
CADJ STORE KappaRU(:,:,:)
CADJ &     = comlev1_bibj, key=idynkey, byte=isbyte
CADJ STORE KappaRV(:,:,:)
CADJ &     = comlev1_bibj, key=idynkey, byte=isbyte
        DO k=1,Nr
          km1  = MAX(1,k-1)
          kp1  = MIN(k+1,Nr)
          kup  = 1+MOD(k+1,2)
          kDown= 1+MOD(k,2)
         kkey = (idynkey-1)*Nr + k
c
CADJ STORE totphihyd (:,:,k,bi,bj)
CADJ &     = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE phihydlow (:,:,bi,bj)
CADJ &     = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE theta (:,:,k,bi,bj)
CADJ &     = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE salt  (:,:,k,bi,bj)
CADJ &     = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE gt(:,:,k,bi,bj)
CADJ &     = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE gs(:,:,k,bi,bj)
CADJ &     = comlev1_bibj_k, key=kkey, byte=isbyte
         IF ( implicitIntGravWave ) THEN
           CALL CALC_PHI_HYD(
     I        bi,bj,iMin,iMax,jMin,jMax,k,
     I        gT, gS,
     U        phiHydF,
     O        phiHydC, dPhiHydX, dPhiHydY,
     I        myTime, myIter, myThid )
         ELSE
           CALL CALC_PHI_HYD(
     I        bi,bj,iMin,iMax,jMin,jMax,k,
     I        theta, salt,
     U        phiHydF,
     O        phiHydC, dPhiHydX, dPhiHydY,
     I        myTime, myIter, myThid )
         ENDIF
         IF ( momStepping ) THEN
           IF (.NOT. vectorInvariantMomentum) THEN
C
              CALL MOM_FLUXFORM(
     I         bi,bj,iMin,iMax,jMin,jMax,k,kup,kDown,
     I         KappaRU, KappaRV,
     U         fVerU, fVerV,
     O         guDissip, gvDissip,
     I         myTime, myIter, myThid)
           ELSE
C
C
             CALL MOM_VECINV(
     I         bi,bj,iMin,iMax,jMin,jMax,k,kup,kDown,
     I         KappaRU, KappaRV,
     U         fVerU, fVerV,
     O         guDissip, gvDissip,
     I         myTime, myIter, myThid)
           ENDIF
C
           CALL TIMESTEP(
     I         bi,bj,iMin,iMax,jMin,jMax,k,
     I         dPhiHydX,dPhiHydY, phiSurfX, phiSurfY,
     I         guDissip, gvDissip,
     I         myTime, myIter, myThid)
         ENDIF
        ENDDO
        IF     ( implicitViscosity ) THEN
CADJ STORE KappaRU(:,:,:) = comlev1_bibj , key=idynkey, byte=isbyte
CADJ STORE gU(:,:,:,bi,bj) = comlev1_bibj , key=idynkey, byte=isbyte
          CALL IMPLDIFF(
     I         bi, bj, iMin, iMax, jMin, jMax,
     I         -1, KappaRU,recip_HFacW,
     U         gU,
     I         myThid )
CADJ STORE KappaRV(:,:,:) = comlev1_bibj , key=idynkey, byte=isbyte
CADJ STORE gV(:,:,:,bi,bj) = comlev1_bibj , key=idynkey, byte=isbyte
          CALL IMPLDIFF(
     I         bi, bj, iMin, iMax, jMin, jMax,
     I         -2, KappaRV,recip_HFacS,
     U         gV,
     I         myThid )
        ENDIF
        IF (implicitViscosity.AND.useCDscheme) THEN
CADJ STORE vVelD(:,:,:,bi,bj) = comlev1_bibj , key=idynkey, byte=isbyte
          CALL IMPLDIFF(
     I         bi, bj, iMin, iMax, jMin, jMax,
     I         0, KappaRU,recip_HFacW,
     U         vVelD,
     I         myThid )
CADJ STORE uVelD(:,:,:,bi,bj) = comlev1_bibj , key=idynkey, byte=isbyte
          CALL IMPLDIFF(
     I         bi, bj, iMin, iMax, jMin, jMax,
     I         0, KappaRV,recip_HFacS,
     U         uVelD,
     I         myThid )
        ENDIF
       ENDDO
      ENDDO
      If ( debugLevel .GE. debLevB ) THEN
       CALL DEBUG_STATS_RL(1,EtaN,'EtaN (DYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,uVel,'Uvel (DYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,vVel,'Vvel (DYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,wVel,'Wvel (DYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,theta,'Theta (DYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,salt,'Salt (DYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,gU,'Gu (DYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,gV,'Gv (DYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,gT,'Gt (DYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,gS,'Gs (DYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,guNm1,'GuNm1 (DYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,gvNm1,'GvNm1 (DYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,gtNm1,'GtNm1 (DYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,gsNm1,'GsNm1 (DYNAMICS)',myThid)
      ENDIF
      IF ( debugLevel .GE. debLevB )
     &   CALL DEBUG_LEAVE( 'DYNAMICS', myThid )
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE EXTERNAL_FIELDS_LOAD( myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      Real*8     myTime
      INTEGER myIter
      INTEGER bi,bj,i,j,intime0,intime1
      Real*8 aWght,bWght,rdt
      Real*8 tmp1Wght, tmp2Wght
      INTEGER nForcingPeriods,Imytm,Ifprd,Ifcyc,Iftm
      IF ( periodicExternalForcing ) THEN
      rdt = 1.d0 / deltaTclock
      nForcingPeriods = NINT(externForcingCycle/externForcingPeriod)
      Imytm = NINT(myTime*rdt)
      Ifprd = NINT(externForcingPeriod*rdt)
      Ifcyc = NINT(externForcingCycle*rdt)
      Imytm = Imytm + Ifcyc*( 1 - NINT(myTime/externForcingCycle) )
      Iftm  = MOD( Imytm+Ifcyc-Ifprd/2, Ifcyc)
      intime0 = 1 + INT(Iftm/Ifprd)
      intime1 = 1 + MOD(intime0,nForcingPeriods)
      tmp1Wght = FLOAT( Iftm-Ifprd*(intime0 - 1) )
      tmp2Wght = FLOAT( Ifprd )
      aWght =  tmp1Wght / tmp2Wght
      bWght = 1.d0 - aWght
      IF (
     &  Iftm-Ifprd*(intime0-1) .EQ. 0
     &  .OR. myIter .EQ. nIter0
     & ) THEN
       IF ( myThid .EQ. 1 ) THEN
       WRITE(standardMessageUnit,'(A,2I5,I10,1P1E20.12)')
     &  'S/R EXTERNAL_FIELDS_LOAD: Reading new data:',
     &  intime0, intime1, myIter, myTime
       ENDIF
      IF ( zonalWindFile .NE. ' '  ) THEN
       CALL READ_REC_XY_RS( zonalWindFile, taux0,
     &                      intime0, myIter, myThid )
       CALL READ_REC_XY_RS( zonalWindFile, taux1,
     &                      intime1, myIter, myThid )
      ENDIF
      IF ( meridWindFile .NE. ' '  ) THEN
       CALL READ_REC_XY_RS( meridWindFile, tauy0,
     &                      intime0, myIter, myThid )
       CALL READ_REC_XY_RS( meridWindFile, tauy1,
     &                      intime1, myIter, myThid )
      ENDIF
      IF ( surfQFile .NE. ' '  ) THEN
       CALL READ_REC_XY_RS( surfQFile, Qnet0,
     &                      intime0, myIter, myThid )
       CALL READ_REC_XY_RS( surfQFile, Qnet1,
     &                      intime1, myIter, myThid )
      ELSEIF ( surfQnetFile .NE. ' '  ) THEN
       CALL READ_REC_XY_RS( surfQnetFile, Qnet0,
     &                      intime0, myIter, myThid )
       CALL READ_REC_XY_RS( surfQnetFile, Qnet1,
     &                      intime1, myIter, myThid )
      ENDIF
      IF ( EmPmRfile .NE. ' '  ) THEN
       CALL READ_REC_XY_RS( EmPmRfile, EmPmR0,
     &                      intime0, myIter, myThid )
       CALL READ_REC_XY_RS( EmPmRfile, EmPmR1,
     &                      intime1, myIter, myThid )
        DO bj = myByLo(myThid), myByHi(myThid)
         DO bi = myBxLo(myThid), myBxHi(myThid)
          DO j=1-Oly,sNy+Oly
           DO i=1-Olx,sNx+Olx
            EmPmR0(i,j,bi,bj) = EmPmR0(i,j,bi,bj)*rhoConstFresh
            EmPmR1(i,j,bi,bj) = EmPmR1(i,j,bi,bj)*rhoConstFresh
           ENDDO
          ENDDO
         ENDDO
        ENDDO
      ENDIF
      IF ( saltFluxFile .NE. ' '  ) THEN
       CALL READ_REC_XY_RS( saltFluxFile, saltFlux0,
     &                      intime0, myIter, myThid )
       CALL READ_REC_XY_RS( saltFluxFile, saltFlux1,
     &                      intime1, myIter, myThid )
      ENDIF
      IF ( thetaClimFile .NE. ' '  ) THEN
       CALL READ_REC_XY_RS( thetaClimFile, SST0,
     &                      intime0, myIter, myThid )
       CALL READ_REC_XY_RS( thetaClimFile, SST1,
     &                      intime1, myIter, myThid )
      ENDIF
      IF ( saltClimFile .NE. ' '  ) THEN
       CALL READ_REC_XY_RS( saltClimFile, SSS0,
     &                      intime0, myIter, myThid )
       CALL READ_REC_XY_RS( saltClimFile, SSS1,
     &                      intime1, myIter, myThid )
      ENDIF
       CALL EXCH_XY_RS ( SST0  ,  myThid  )
       CALL EXCH_XY_RS ( SST1  ,  myThid  )
       CALL EXCH_XY_RS ( SSS0  ,  myThid  )
       CALL EXCH_XY_RS ( SSS1  ,  myThid  )
       CALL EXCH_UV_XY_RS(taux0,tauy0,.TRUE.,myThid)
       CALL EXCH_UV_XY_RS(taux1,tauy1,.TRUE.,myThid)
       CALL EXCH_XY_RS ( Qnet0,  myThid  )
       CALL EXCH_XY_RS ( Qnet1,  myThid  )
       CALL EXCH_XY_RS ( EmPmR0,  myThid  )
       CALL EXCH_XY_RS ( EmPmR1,  myThid  )
       CALL EXCH_XY_RS ( saltFlux0,  myThid  )
       CALL EXCH_XY_RS ( saltFlux1,  myThid  )
      ENDIF
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        IF ( thetaClimFile .NE. ' '  ) THEN
          DO j=1-Oly,sNy+Oly
           DO i=1-Olx,sNx+Olx
            SST(i,j,bi,bj)   = bWght*SST0(i,j,bi,bj)
     &                       + aWght*SST1(i,j,bi,bj)
           ENDDO
          ENDDO
        ENDIF
        IF ( saltClimFile .NE. ' '  ) THEN
          DO j=1-Oly,sNy+Oly
           DO i=1-Olx,sNx+Olx
            SSS(i,j,bi,bj)   = bWght*SSS0(i,j,bi,bj)
     &                       + aWght*SSS1(i,j,bi,bj)
           ENDDO
          ENDDO
        ENDIF
        IF ( zonalWindFile .NE. ' '  ) THEN
          DO j=1-Oly,sNy+Oly
           DO i=1-Olx,sNx+Olx
            fu(i,j,bi,bj)    = bWght*taux0(i,j,bi,bj)
     &                       + aWght*taux1(i,j,bi,bj)
           ENDDO
          ENDDO
        ENDIF
        IF ( meridWindFile .NE. ' '  ) THEN
          DO j=1-Oly,sNy+Oly
           DO i=1-Olx,sNx+Olx
            fv(i,j,bi,bj)    = bWght*tauy0(i,j,bi,bj)
     &                       + aWght*tauy1(i,j,bi,bj)
           ENDDO
          ENDDO
        ENDIF
        IF ( surfQnetFile .NE. ' '
     &     .OR. surfQFile .NE. ' '  ) THEN
          DO j=1-Oly,sNy+Oly
           DO i=1-Olx,sNx+Olx
            Qnet(i,j,bi,bj)  = bWght*Qnet0(i,j,bi,bj)
     &                       + aWght*Qnet1(i,j,bi,bj)
           ENDDO
          ENDDO
        ENDIF
        IF ( EmPmRfile .NE. ' '  ) THEN
          DO j=1-Oly,sNy+Oly
           DO i=1-Olx,sNx+Olx
            EmPmR(i,j,bi,bj) = bWght*EmPmR0(i,j,bi,bj)
     &                       + aWght*EmPmR1(i,j,bi,bj)
           ENDDO
          ENDDO
        ENDIF
        IF ( saltFluxFile .NE. ' '  ) THEN
          DO j=1-Oly,sNy+Oly
           DO i=1-Olx,sNx+Olx
            saltFlux(i,j,bi,bj) = bWght*saltFlux0(i,j,bi,bj)
     &                          + aWght*saltFlux1(i,j,bi,bj)
           ENDDO
          ENDDO
        ENDIF
       ENDDO
      ENDDO
      IF ( debugLevel.GE.debLevA  .AND. myTime.LT.62208000.) THEN
        IF (  myThid  .EQ. 1 ) THEN
        WRITE(standardMessageUnit,'(a,1p7e12.4,2i6,2e12.4)')
     &   'time,SST,SSS,fu,fv,Q,E-P,i0,i1,a,b = ',
     &   myTime,
     &   SST(1,sNy,1,1),SSS(1,sNy,1,1),
     &   fu(1,sNy,1,1),fv(1,sNy,1,1),
     &   Qnet(1,sNy,1,1),EmPmR(1,sNy,1,1),
     &   intime0,intime1,aWght,bWght
        WRITE(standardMessageUnit,'(a,1p4e12.4,2E23.15)')
     &   'time,fu0,fu1,fu = ',
     &   myTime,
     &   taux0(1,sNy,1,1),taux1(1,sNy,1,1),fu(1,sNy,1,1),
     &   aWght,bWght
        ENDIF
      ENDIF
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE EXTERNAL_FORCING_U(
     I           iMin,iMax, jMin,jMax, bi,bj, kLev,
     I           myTime, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
      Real*8 myTime
      INTEGER myThid
      INTEGER i, j
      INTEGER kSurface
      IF ( fluidIsAir ) THEN
       kSurface = 0
      ELSEIF ( usingPCoords ) THEN
       kSurface = Nr
      ELSE
       kSurface = 1
      ENDIF
      IF ( kLev .EQ. kSurface ) THEN
       DO j=0,sNy+1
        DO i=1,sNx+1
         gU(i,j,kLev,bi,bj) = gU(i,j,kLev,bi,bj)
     &   +foFacMom*surfaceForcingU(i,j,bi,bj)
     &   *recip_drF(kLev)*recip_hFacW(i,j,kLev,bi,bj)
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
      SUBROUTINE EXTERNAL_FORCING_V(
     I           iMin,iMax, jMin,jMax, bi,bj, kLev,
     I           myTime, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
      Real*8 myTime
      INTEGER myThid
      INTEGER i, j
      INTEGER kSurface
      IF ( fluidIsAir ) THEN
       kSurface = 0
      ELSEIF ( usingPCoords ) THEN
       kSurface = Nr
      ELSE
       kSurface = 1
      ENDIF
      IF ( kLev .EQ. kSurface ) THEN
       DO j=1,sNy+1
        DO i=0,sNx+1
         gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj)
     &   +foFacMom*surfaceForcingV(i,j,bi,bj)
     &   *recip_drF(kLev)*recip_hFacS(i,j,kLev,bi,bj)
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
      SUBROUTINE EXTERNAL_FORCING_T(
     I           iMin,iMax, jMin,jMax, bi,bj, kLev,
     I           myTime, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
      Real*8 myTime
      INTEGER myThid
      INTEGER i, j
      INTEGER kSurface
      IF ( fluidIsAir ) THEN
       kSurface = 0
      ELSEIF ( usingPCoords ) THEN
       kSurface = Nr
      ELSE
       kSurface = 1
      ENDIF
      IF ( kLev .EQ. kSurface ) THEN
       DO j=1,sNy
        DO i=1,sNx
         gT(i,j,kLev,bi,bj)=gT(i,j,kLev,bi,bj)
     &     +surfaceForcingT(i,j,bi,bj)
     &     *recip_drF(kLev)*recip_hFacC(i,j,kLev,bi,bj)
        ENDDO
       ENDDO
      ENDIF
      IF (linFSConserveTr) THEN
       DO j=1,sNy
        DO i=1,sNx
          IF (kLev .EQ. ksurfC(i,j,bi,bj)) THEN
            gT(i,j,kLev,bi,bj)=gT(i,j,kLev,bi,bj)
     &        +TsurfCor*recip_drF(kLev)*recip_hFacC(i,j,kLev,bi,bj)
          ENDIF
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
      SUBROUTINE EXTERNAL_FORCING_S(
     I           iMin,iMax, jMin,jMax, bi,bj, kLev,
     I           myTime, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
      Real*8 myTime
      INTEGER myThid
      INTEGER i, j
      INTEGER kSurface
      IF ( fluidIsAir ) THEN
       kSurface = 0
      ELSEIF ( usingPCoords ) THEN
       kSurface = Nr
      ELSE
       kSurface = 1
      ENDIF
      IF ( kLev .EQ. kSurface ) THEN
       DO j=1,sNy
        DO i=1,sNx
         gS(i,j,kLev,bi,bj)=gS(i,j,kLev,bi,bj)
     &     +surfaceForcingS(i,j,bi,bj)
     &     *recip_drF(kLev)*recip_hFacC(i,j,kLev,bi,bj)
        ENDDO
       ENDDO
      ENDIF
      IF (linFSConserveTr) THEN
       DO j=1,sNy
        DO i=1,sNx
          IF (kLev .EQ. ksurfC(i,j,bi,bj)) THEN
            gS(i,j,kLev,bi,bj)=gS(i,j,kLev,bi,bj)
     &        +SsurfCor*recip_drF(kLev)*recip_hFacC(i,j,kLev,bi,bj)
          ENDIF
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE EXTERNAL_FORCING_SURF(
     I             bi, bj, iMin, iMax, jMin, jMax,
     I             myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj
      INTEGER iMin, iMax
      INTEGER jMin, jMax
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      INTEGER i,j
      INTEGER ks
      IF ( usingPCoords ) THEN
       ks        = Nr
      ELSE
       ks        = 1
      ENDIF
      IF ( doThetaClimRelax .OR. doSaltClimRelax ) THEN
        DO j = jMin, jMax
         DO i = iMin, iMax
          surfaceForcingT(i,j,bi,bj) =
     &      -lambdaThetaClimRelax(i,j,bi,bj)
     &         *(theta(i,j,ks,bi,bj)-SST(i,j,bi,bj))
     &         *drF(ks)*hFacC(i,j,ks,bi,bj)
          surfaceForcingS(i,j,bi,bj) =
     &      -lambdaSaltClimRelax(i,j,bi,bj)
     &         *(salt(i,j,ks,bi,bj)-SSS(i,j,bi,bj))
     &         *drF(ks)*hFacC(i,j,ks,bi,bj)
         ENDDO
        ENDDO
      ELSE
       DO j = jMin, jMax
        DO i = iMin, iMax
          surfaceForcingT(i,j,bi,bj) = 0.d0
          surfaceForcingS(i,j,bi,bj) = 0.d0
        ENDDO
       ENDDO
      ENDIF
      DO j = jMin, jMax
         DO i = iMin, iMax
          surfaceForcingU(i,j,bi,bj) =
     &      fu(i,j,bi,bj)*mass2rUnit
          surfaceForcingV(i,j,bi,bj) =
     &      fv(i,j,bi,bj)*mass2rUnit
          surfaceForcingT(i,j,bi,bj) = surfaceForcingT(i,j,bi,bj)
     &       - ( Qnet(i,j,bi,bj)
     &          +Qnetm(i,j,bi,bj)
     &         ) *recip_Cp*mass2rUnit
          surfaceForcingS(i,j,bi,bj) = surfaceForcingS(i,j,bi,bj)
     &      -saltFlux(i,j,bi,bj)*mass2rUnit
         ENDDO
      ENDDO
      IF ( useRealFreshWaterFlux ) THEN
        DO j=1-OLy,sNy+OLy
         DO i=1-OLx,sNx+OLx
           EmPmR(i,j,bi,bj) = EmPmR(i,j,bi,bj)*maskInC(i,j,bi,bj)
         ENDDO
        ENDDO
      ENDIF
      IF ( staggerTimeStep ) THEN
        DO j=1-OLy,sNy+OLy
         DO i=1-OLx,sNx+OLx
           PmEpR(i,j,bi,bj) = -EmPmR(i,j,bi,bj)
         ENDDO
        ENDDO
      ENDIF
      IF ( (nonlinFreeSurf.GT.0 .OR. usingPCoords)
     &     .AND. useRealFreshWaterFlux ) THEN
       IF (temp_EvPrRn.NE.UNSET_RL) THEN
        DO j = jMin, jMax
         DO i = iMin, iMax
          surfaceForcingT(i,j,bi,bj) = surfaceForcingT(i,j,bi,bj)
     &      + PmEpR(i,j,bi,bj)
     &          *( temp_EvPrRn - theta(i,j,ks,bi,bj) )
     &          *mass2rUnit
         ENDDO
        ENDDO
       ENDIF
       IF (salt_EvPrRn.NE.UNSET_RL) THEN
        DO j = jMin, jMax
         DO i = iMin, iMax
          surfaceForcingS(i,j,bi,bj) = surfaceForcingS(i,j,bi,bj)
     &      + PmEpR(i,j,bi,bj)
     &          *( salt_EvPrRn - salt(i,j,ks,bi,bj) )
     &          *mass2rUnit
         ENDDO
        ENDDO
       ENDIF
      ELSE
       IF (convertFW2Salt .EQ. -1.) THEN
        IF (temp_EvPrRn.NE.UNSET_RL) THEN
         DO j = jMin, jMax
          DO i = iMin, iMax
           surfaceForcingT(i,j,bi,bj) = surfaceForcingT(i,j,bi,bj)
     &       + EmPmR(i,j,bi,bj)
     &           *( theta(i,j,ks,bi,bj) - temp_EvPrRn )
     &           *mass2rUnit
          ENDDO
         ENDDO
        ENDIF
        IF (salt_EvPrRn.NE.UNSET_RL) THEN
         DO j = jMin, jMax
          DO i = iMin, iMax
           surfaceForcingS(i,j,bi,bj) = surfaceForcingS(i,j,bi,bj)
     &       + EmPmR(i,j,bi,bj)
     &           *( salt(i,j,ks,bi,bj) - salt_EvPrRn )
     &           *mass2rUnit
          ENDDO
         ENDDO
        ENDIF
       ELSE
        IF (temp_EvPrRn.NE.UNSET_RL) THEN
         DO j = jMin, jMax
          DO i = iMin, iMax
           surfaceForcingT(i,j,bi,bj) = surfaceForcingT(i,j,bi,bj)
     &       + EmPmR(i,j,bi,bj)
     &           *( tRef(ks) - temp_EvPrRn )
     &           *mass2rUnit
          ENDDO
         ENDDO
        ENDIF
        IF (salt_EvPrRn.NE.UNSET_RL) THEN
         DO j = jMin, jMax
          DO i = iMin, iMax
           surfaceForcingS(i,j,bi,bj) = surfaceForcingS(i,j,bi,bj)
     &       + EmPmR(i,j,bi,bj)
     &           *( convertFW2Salt - salt_EvPrRn )
     &           *mass2rUnit
          ENDDO
         ENDDO
        ENDIF
       ENDIF
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE FIND_ALPHA (
     I     bi, bj, iMin, iMax, jMin, jMax,  k, kRef,
     O     alphaLoc,
     I     myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      Real*8 SItoBar, SItodBar
      PARAMETER ( SItoBar  = 1.D-05 )
      PARAMETER ( SItodBar = 1.D-04 )
      COMMON /PARM_EOS_LIN/ tAlpha,sBeta,equationOfState
      Real*8 tAlpha
      Real*8 sBeta
      character*(6) equationOfState
      COMMON /PARM_EOS_NL/ eosC,eosSig0,eosRefT,eosRefS
      Real*8 eosC(9,Nr+1),eosSig0(Nr+1),eosRefT(Nr+1),eosRefS(Nr+1)
      Real*8 eosJMDCFw(6), eosJMDCSw(9)
      Real*8 eosJMDCKFw(5), eosJMDCKSw(7), eosJMDCKP(14)
      COMMON /PARM_EOS_JMD95/
     &     eosJMDCFw, eosJMDCSw, eosJMDCKFw, eosJMDCKSw, eosJMDCKP
      Real*8 eosMDJWFnum(0:11), eosMDJWFden(0:12)
      COMMON /PARM_EOS_MDJWF/ 
     &     eosMDJWFnum, eosMDJWFden
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      INTEGER bi,bj,iMin,iMax,jMin,jMax
      INTEGER k
      INTEGER kRef
      Real*8 alphaLoc(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      INTEGER i,j
      Real*8 refTemp,refSalt,tP,sP
      Real*8 t1, t2, t3, s1, s3o2, p1, p2, sp5, p1t1
      Real*8 drhoP0dtheta, drhoP0dthetaFresh, drhoP0dthetaSalt
      Real*8 dKdtheta, dKdthetaFresh, dKdthetaSalt, dKdthetaPres
      Real*8 locPres(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 rhoP0  (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 bulkMod(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 dnum_dtheta, dden_dtheta
      Real*8 rhoDen (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 rhoLoc (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      IF (equationOfState.EQ.'LINEAR') THEN
         DO j=jMin,jMax
            DO i=iMin,iMax
               alphaLoc(i,j) = -rhonil * tAlpha
            ENDDO
         ENDDO
      ELSEIF (equationOfState.EQ.'POLY3') THEN
         refTemp=eosRefT(kRef)
         refSalt=eosRefS(kRef)
         DO j=jMin,jMax
            DO i=iMin,iMax
               tP=theta(i,j,k,bi,bj)-refTemp
               sP=salt(i,j,k,bi,bj)-refSalt
               alphaLoc(i,j) =
     &     ( eosC(6,kRef)
     &         *tP*3.
     &        +(eosC(7,kRef)*sP + eosC(3,kRef))*2.
     &       )*tP
     &      +(eosC(8,kRef)*sP + eosC(4,kRef) )*sP + eosC(1,kRef)
     &
            ENDDO
         ENDDO
      ELSEIF ( equationOfState(1:5).EQ.'JMD95'
     &        .OR. equationOfState.EQ.'UNESCO' ) THEN
         CALL PRESSURE_FOR_EOS(
     I        bi, bj, iMin, iMax, jMin, jMax,  kRef,
     O        locPres,
     I        myThid )
         CALL FIND_RHOP0(
     I        iMin, iMax, jMin, jMax,
     I        theta(1-OLx,1-OLy,k,bi,bj), salt(1-OLx,1-OLy,k,bi,bj),
     O        rhoP0,
     I        myThid )
         CALL FIND_BULKMOD(
     I        iMin, iMax, jMin, jMax, locPres,
     I        theta(1-OLx,1-OLy,k,bi,bj), salt(1-OLx,1-OLy,k,bi,bj),
     O        bulkMod,
     I        myThid )
         DO j=jMin,jMax
            DO i=iMin,iMax
               t1 = theta(i,j,k,bi,bj)
               t2 = t1*t1
               t3 = t2*t1
               s1  = salt(i,j,k,bi,bj)
              IF ( s1 .GT. 0.d0 ) THEN
               s3o2 = SQRT(s1*s1*s1)
              ELSE
               s1   = 0.d0
               s3o2 = 0.d0
              ENDIF
               p1  = locPres(i,j)*SItoBar
               p2 = p1*p1
               drhoP0dthetaFresh =
     &                eosJMDCFw(2)
     &           + 2.*eosJMDCFw(3)*t1
     &           + 3.*eosJMDCFw(4)*t2
     &           + 4.*eosJMDCFw(5)*t3
     &           + 5.*eosJMDCFw(6)*t3*t1
               drhoP0dthetaSalt =
     &        s1*(
     &                eosJMDCSw(2)
     &           + 2.*eosJMDCSw(3)*t1
     &           + 3.*eosJMDCSw(4)*t2
     &           + 4.*eosJMDCSw(5)*t3
     &           )
     &       + s3o2*(
     &           +    eosJMDCSw(7)
     &           + 2.*eosJMDCSw(8)*t1
     &           )
               dKdthetaFresh =
     &                eosJMDCKFw(2)
     &           + 2.*eosJMDCKFw(3)*t1
     &           + 3.*eosJMDCKFw(4)*t2
     &           + 4.*eosJMDCKFw(5)*t3
               dKdthetaSalt =
     &        s1*(    eosJMDCKSw(2)
     &           + 2.*eosJMDCKSw(3)*t1
     &           + 3.*eosJMDCKSw(4)*t2
     &           )
     &    + s3o2*(    eosJMDCKSw(6)
     &           + 2.*eosJMDCKSw(7)*t1
     &           )
               dKdthetaPres =
     &        p1*(    eosJMDCKP(2)
     &           + 2.*eosJMDCKP(3)*t1
     &           + 3.*eosJMDCKP(4)*t2
     &           )
     &   + p1*s1*(    eosJMDCKP(6)
     &           + 2.*eosJMDCKP(7)*t1
     &           )
     &      + p2*(    eosJMDCKP(10)
     &           + 2.*eosJMDCKP(11)*t1
     &           )
     &   + p2*s1*(    eosJMDCKP(13)
     &           + 2.*eosJMDCKP(14)*t1
     &           )
               drhoP0dtheta  = drhoP0dthetaFresh
     &                       + drhoP0dthetaSalt
               dKdtheta      = dKdthetaFresh
     &                       + dKdthetaSalt
     &                       + dKdthetaPres
               alphaLoc(i,j) =
     &              ( bulkmod(i,j)**2*drhoP0dtheta
     &              - bulkmod(i,j)*p1*drhoP0dtheta
     &              - rhoP0(i,j)*p1*dKdtheta )
     &              /( bulkmod(i,j) - p1 )**2
            ENDDO
         ENDDO
      ELSEIF ( equationOfState.EQ.'MDJWF' ) THEN
         CALL PRESSURE_FOR_EOS(
     I        bi, bj, iMin, iMax, jMin, jMax,  kRef,
     O        locPres,
     I        myThid )
         CALL FIND_RHONUM(
     I        iMin, iMax, jMin, jMax, locPres,
     I        theta(1-OLx,1-OLy,k,bi,bj), salt(1-OLx,1-OLy,k,bi,bj),
     O        rhoLoc,
     I        myThid )
         CALL FIND_RHODEN(
     I        iMin, iMax, jMin, jMax, locPres,
     I        theta(1-OLx,1-OLy,k,bi,bj), salt(1-OLx,1-OLy,k,bi,bj),
     O        rhoDen,
     I        myThid )
         DO j=jMin,jMax
            DO i=iMin,iMax
               t1  = theta(i,j,k,bi,bj)
               t2  = t1*t1
               s1  = salt(i,j,k,bi,bj)
              IF ( s1 .GT. 0.d0 ) THEN
               sp5 = SQRT(s1)
              ELSE
               s1  = 0.d0
               sp5 = 0.d0
              ENDIF
               p1   = locPres(i,j)*SItodBar
               p1t1 = p1*t1
               dnum_dtheta = eosMDJWFnum(1)
     &              + t1*(2.*eosMDJWFnum(2) + 3.*eosMDJWFnum(3)*t1)
     &              + eosMDJWFnum(5)*s1
     &              + p1t1*(2.*eosMDJWFnum(8) + 2.*eosMDJWFnum(11)*p1)
               dden_dtheta = eosMDJWFden(1)
     &              + t1*(2.*eosMDJWFden(2)
     &              +     t1*(3.*eosMDJWFden(3)
     &              +         4.*eosMDJWFden(4)*t1 ) )
     &              + s1*(eosMDJWFden(6)
     &              +     t1*(3.*eosMDJWFden(7)*t1
     &              +         2.*eosMDJWFden(9)*sp5 ) )
     &              + p1*p1*(3.*eosMDJWFden(11)*t2 + eosMDJWFden(12)*p1)
               alphaLoc(i,j)    = rhoDen(i,j)*(dnum_dtheta
     &              - (rhoLoc(i,j)*rhoDen(i,j))*dden_dtheta)
         ENDDO
      ENDDO
      ELSE
         WRITE(*,*) 'FIND_ALPHA: equationOfState = ',equationOfState
         STOP 'FIND_ALPHA: "equationOfState" has illegal value'
      ENDIF
      RETURN
      END
      SUBROUTINE FIND_BETA (
     I     bi, bj, iMin, iMax, jMin, jMax,  k, kRef,
     O     betaLoc,
     I     myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      Real*8 SItoBar, SItodBar
      PARAMETER ( SItoBar  = 1.D-05 )
      PARAMETER ( SItodBar = 1.D-04 )
      COMMON /PARM_EOS_LIN/ tAlpha,sBeta,equationOfState
      Real*8 tAlpha
      Real*8 sBeta
      character*(6) equationOfState
      COMMON /PARM_EOS_NL/ eosC,eosSig0,eosRefT,eosRefS
      Real*8 eosC(9,Nr+1),eosSig0(Nr+1),eosRefT(Nr+1),eosRefS(Nr+1)
      Real*8 eosJMDCFw(6), eosJMDCSw(9)
      Real*8 eosJMDCKFw(5), eosJMDCKSw(7), eosJMDCKP(14)
      COMMON /PARM_EOS_JMD95/
     &     eosJMDCFw, eosJMDCSw, eosJMDCKFw, eosJMDCKSw, eosJMDCKP
      Real*8 eosMDJWFnum(0:11), eosMDJWFden(0:12)
      COMMON /PARM_EOS_MDJWF/ 
     &     eosMDJWFnum, eosMDJWFden
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      INTEGER bi,bj,iMin,iMax,jMin,jMax
      INTEGER k
      INTEGER kRef
      Real*8 betaLoc(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      INTEGER i,j
      Real*8 refTemp,refSalt,tP,sP
      Real*8 t1, t2, t3, s1, s3o2, p1, sp5, p1t1
      Real*8 drhoP0dS
      Real*8 dKdS, dKdSSalt, dKdSPres
      Real*8 locPres(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 rhoP0  (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 bulkMod(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 dnum_dsalt, dden_dsalt
      Real*8 rhoDen (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 rhoLoc (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      IF (equationOfState.EQ.'LINEAR') THEN
         DO j=jMin,jMax
            DO i=iMin,iMax
               betaLoc(i,j) = rhonil * sBeta
            ENDDO
         ENDDO
      ELSEIF (equationOfState.EQ.'POLY3') THEN
         refTemp=eosRefT(kRef)
         refSalt=eosRefS(kRef)
         DO j=jMin,jMax
            DO i=iMin,iMax
               tP=theta(i,j,k,bi,bj)-refTemp
               sP=salt(i,j,k,bi,bj)-refSalt
               betaLoc(i,j) =
     &    ( eosC(9,kRef)*sP*3. + eosC(5,kRef)*2. )*sP + eosC(2,kRef)
     &   + ( eosC(7,kRef)*tP
     &      +eosC(8,kRef)*sP*2. + eosC(4,kRef)
     &     )*tP
            ENDDO
         ENDDO
      ELSEIF ( equationOfState(1:5).EQ.'JMD95'
     &        .OR. equationOfState.EQ.'UNESCO' ) THEN
         CALL PRESSURE_FOR_EOS(
     I        bi, bj, iMin, iMax, jMin, jMax,  kRef,
     O        locPres,
     I        myThid )
         CALL FIND_RHOP0(
     I        iMin, iMax, jMin, jMax,
     I        theta(1-OLx,1-OLy,k,bi,bj), salt(1-OLx,1-OLy,k,bi,bj),
     O        rhoP0,
     I        myThid )
         CALL FIND_BULKMOD(
     I        iMin, iMax, jMin, jMax, locPres,
     I        theta(1-OLx,1-OLy,k,bi,bj), salt(1-OLx,1-OLy,k,bi,bj),
     O        bulkMod,
     I        myThid )
         DO j=jMin,jMax
            DO i=iMin,iMax
               t1 = theta(i,j,k,bi,bj)
               t2 = t1*t1
               t3 = t2*t1
               s1  = salt(i,j,k,bi,bj)
              IF ( s1 .GT. 0.d0 ) THEN
               s3o2 = 1.5*SQRT(s1)
              ELSE
               s1   = 0.d0
               s3o2 = 0.d0
              ENDIF
               p1  = locPres(i,j)*SItoBar
               drhoP0dS = 0.d0
               drhoP0dS = drhoP0dS
     &              + eosJMDCSw(1)
     &              + eosJMDCSw(2)*t1
     &              + eosJMDCSw(3)*t2
     &              + eosJMDCSw(4)*t3
     &              + eosJMDCSw(5)*t3*t1
     &       + s3o2*(
     &                eosJMDCSw(6)
     &              + eosJMDCSw(7)*t1
     &              + eosJMDCSw(8)*t2
     &              )
     &              + 2*eosJMDCSw(9)*s1
               dKdS = 0.d0
               dKdSSalt =
     &                eosJMDCKSw(1)
     &              + eosJMDCKSw(2)*t1
     &              + eosJMDCKSw(3)*t2
     &              + eosJMDCKSw(4)*t3
     &       + s3o2*( eosJMDCKSw(5)
     &              + eosJMDCKSw(6)*t1
     &              + eosJMDCKSw(7)*t2
     &              )
               dKdSPres =
     &           p1*( eosJMDCKP(5)
     &              + eosJMDCKP(6)*t1
     &              + eosJMDCKP(7)*t2
     &              )
     &        + s3o2*p1*eosJMDCKP(8)
     &      + p1*p1*( eosJMDCKP(12)
     &              + eosJMDCKP(13)*t1
     &              + eosJMDCKP(14)*t2
     &              )
               dKdS = dKdSSalt + dKdSPres
               betaLoc(i,j) =
     &              ( bulkmod(i,j)**2*drhoP0dS
     &              - bulkmod(i,j)*p1*drhoP0dS
     &              - rhoP0(i,j)*p1*dKdS )
     &              /( bulkmod(i,j) - p1 )**2
            ENDDO
         ENDDO
      ELSEIF ( equationOfState.EQ.'MDJWF' ) THEN
         CALL PRESSURE_FOR_EOS(
     I        bi, bj, iMin, iMax, jMin, jMax,  kRef,
     O        locPres,
     I        myThid )
         CALL FIND_RHONUM(
     I        iMin, iMax, jMin, jMax, locPres,
     I        theta(1-OLx,1-OLy,k,bi,bj), salt(1-OLx,1-OLy,k,bi,bj),
     O        rhoLoc,
     I        myThid )
         CALL FIND_RHODEN(
     I        iMin, iMax, jMin, jMax, locPres,
     I        theta(1-OLx,1-OLy,k,bi,bj), salt(1-OLx,1-OLy,k,bi,bj),
     O        rhoDen,
     I        myThid )
         DO j=jMin,jMax
            DO i=iMin,iMax
               t1  = theta(i,j,k,bi,bj)
               t2  = t1*t1
               s1  = salt(i,j,k,bi,bj)
              IF ( s1 .GT. 0.d0 ) THEN
               sp5 = SQRT(s1)
              ELSE
               s1  = 0.d0
               sp5 = 0.d0
              ENDIF
               p1   = locPres(i,j)*SItodBar
               p1t1 = p1*t1
               dnum_dsalt = eosMDJWFnum(4)
     &              + eosMDJWFnum(5)*t1
     &              + 2.*eosMDJWFnum(6)*s1 + eosMDJWFnum(9)*p1
               dden_dsalt = eosMDJWFden(5)
     &              + t1*( eosMDJWFden(6) + eosMDJWFden(7)*t2 )
     &              + 1.5*sp5*(eosMDJWFden(8) + eosMDJWFden(9)*t2)
               betaLoc(i,j) = rhoDen(i,j)*( dnum_dsalt
     &              - (rhoLoc(i,j)*rhoDen(i,j))*dden_dsalt )
            ENDDO
         ENDDO
      ELSE
         WRITE(*,*) 'FIND_BETA: equationOfState = ',equationOfState
         STOP 'FIND_BETA: "equationOfState" has illegal value'
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE FIND_RHO_2D(
     I                iMin, iMax, jMin, jMax, kRef,
     I                tFld, sFld,
     O                rhoLoc,
     I                k, bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      Real*8 SItoBar, SItodBar
      PARAMETER ( SItoBar  = 1.D-05 )
      PARAMETER ( SItodBar = 1.D-04 )
      COMMON /PARM_EOS_LIN/ tAlpha,sBeta,equationOfState
      Real*8 tAlpha
      Real*8 sBeta
      character*(6) equationOfState
      COMMON /PARM_EOS_NL/ eosC,eosSig0,eosRefT,eosRefS
      Real*8 eosC(9,Nr+1),eosSig0(Nr+1),eosRefT(Nr+1),eosRefS(Nr+1)
      Real*8 eosJMDCFw(6), eosJMDCSw(9)
      Real*8 eosJMDCKFw(5), eosJMDCKSw(7), eosJMDCKP(14)
      COMMON /PARM_EOS_JMD95/
     &     eosJMDCFw, eosJMDCSw, eosJMDCKFw, eosJMDCKSw, eosJMDCKP
      Real*8 eosMDJWFnum(0:11), eosMDJWFden(0:12)
      COMMON /PARM_EOS_MDJWF/ 
     &     eosMDJWFnum, eosMDJWFden
      INTEGER iMin,iMax,jMin,jMax
      INTEGER kRef
      Real*8 tFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 sFld  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rhoLoc(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      INTEGER k, bi, bj
      INTEGER myThid
      INTEGER i,j
      Real*8 refTemp,refSalt,sigRef,tP,sP,deltaSig,dRho
      Real*8 locPres(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 rhoP0  (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 bulkMod(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 rhoNum (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 rhoDen (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      DO j=1-OLy,sNy+OLy
       DO i=1-OLx,sNx+OLx
        rhoLoc(i,j)  = 0.d0
        rhoP0(i,j)   = 0.d0
        bulkMod(i,j) = 0.d0
       ENDDO
      ENDDO
      IF (equationOfState.EQ.'LINEAR') THEN
       refTemp=tRef(kRef)
       refSalt=sRef(kRef)
       dRho = rhoNil-rhoConst
       DO j=jMin,jMax
        DO i=iMin,iMax
         rhoLoc(i,j)=rhoNil*(
     &     sBeta*(sFld(i,j)-refSalt)
     &   -tAlpha*(tFld(i,j)-refTemp) )
     &        + dRho
        ENDDO
       ENDDO
      ELSEIF (equationOfState.EQ.'POLY3') THEN
       refTemp=eosRefT(kRef)
       refSalt=eosRefS(kRef)
       sigRef=eosSig0(kRef) + (1000.-rhoConst)
       DO j=jMin,jMax
        DO i=iMin,iMax
         tP=tFld(i,j)-refTemp
         sP=sFld(i,j)-refSalt
         deltaSig=
     &    (( eosC(9,kRef)*sP + eosC(5,kRef) )*sP + eosC(2,kRef) )*sP
     &   + ( ( eosC(6,kRef)
     &         *tP
     &        +eosC(7,kRef)*sP + eosC(3,kRef)
     &       )*tP
     &      +(eosC(8,kRef)*sP + eosC(4,kRef) )*sP + eosC(1,kRef)
     &     )*tP
         rhoLoc(i,j)=sigRef+deltaSig
        ENDDO
       ENDDO
      ELSEIF ( equationOfState(1:5).EQ.'JMD95'
     &      .OR. equationOfState.EQ.'UNESCO' ) THEN
         CALL PRESSURE_FOR_EOS(
     I             bi, bj, iMin, iMax, jMin, jMax, kRef,
     O             locPres,
     I             myThid )
         CALL FIND_RHOP0(
     I             iMin, iMax, jMin, jMax,
     I             tFld, sFld,
     O             rhoP0,
     I             myThid )
         CALL FIND_BULKMOD(
     I             iMin, iMax, jMin, jMax,
     I             locPres, tFld, sFld,
     O             bulkMod,
     I             myThid )
         DO j=jMin,jMax
          DO i=iMin,iMax
            rhoLoc(i,j) = rhoP0(i,j)
     &              /(1.d0 -
     &              locPres(i,j)*SItoBar/bulkMod(i,j) )
     &              - rhoConst
          ENDDO
         ENDDO
      ELSEIF ( equationOfState.EQ.'MDJWF' ) THEN
         CALL PRESSURE_FOR_EOS(
     I             bi, bj, iMin, iMax, jMin, jMax, kRef,
     O             locPres,
     I             myThid )
         CALL FIND_RHONUM(
     I             iMin, iMax, jMin, jMax,
     I             locPres, tFld, sFld,
     O             rhoNum,
     I             myThid )
         CALL FIND_RHODEN(
     I             iMin, iMax, jMin, jMax,
     I             locPres, tFld, sFld,
     O             rhoDen,
     I             myThid )
         DO j=jMin,jMax
          DO i=iMin,iMax
            rhoLoc(i,j) = rhoNum(i,j)*rhoDen(i,j) - rhoConst
          ENDDO
         ENDDO
      ELSEIF( equationOfState .EQ. 'IDEALG' ) THEN
C
      ELSE
       WRITE(msgBuf,'(3a)')
     &      ' FIND_RHO_2D: equationOfState = "',equationOfState,'"'
       CALL PRINT_ERROR( msgBuf, myThid )
       STOP 'ABNORMAL END: S/R FIND_RHO_2D'
      ENDIF
      RETURN
      END
      SUBROUTINE FIND_RHOP0(
     I                iMin, iMax, jMin, jMax,
     I                tFld, sFld,
     O                rhoP0,
     I                myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      Real*8 SItoBar, SItodBar
      PARAMETER ( SItoBar  = 1.D-05 )
      PARAMETER ( SItodBar = 1.D-04 )
      COMMON /PARM_EOS_LIN/ tAlpha,sBeta,equationOfState
      Real*8 tAlpha
      Real*8 sBeta
      character*(6) equationOfState
      COMMON /PARM_EOS_NL/ eosC,eosSig0,eosRefT,eosRefS
      Real*8 eosC(9,Nr+1),eosSig0(Nr+1),eosRefT(Nr+1),eosRefS(Nr+1)
      Real*8 eosJMDCFw(6), eosJMDCSw(9)
      Real*8 eosJMDCKFw(5), eosJMDCKSw(7), eosJMDCKP(14)
      COMMON /PARM_EOS_JMD95/
     &     eosJMDCFw, eosJMDCSw, eosJMDCKFw, eosJMDCKSw, eosJMDCKP
      Real*8 eosMDJWFnum(0:11), eosMDJWFden(0:12)
      COMMON /PARM_EOS_MDJWF/ 
     &     eosMDJWFnum, eosMDJWFden
      INTEGER iMin,iMax,jMin,jMax
      Real*8 tFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 sFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rhoP0(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      INTEGER myThid
      INTEGER i,j
      Real*8 rfresh, rsalt
      Real*8 t, t2, t3, t4, s, s3o2
      DO j=jMin,jMax
         DO i=iMin,iMax
            t  = tFld(i,j)
            t2 = t*t
            t3 = t2*t
            t4 = t3*t
            s  = sFld(i,j)
           IF ( s .GT. 0.d0 ) THEN
            s3o2 = s*SQRT(s)
           ELSE
            s    = 0.d0
            s3o2 = 0.d0
           ENDIF
            rfresh =
     &             eosJMDCFw(1)
     &           + eosJMDCFw(2)*t
     &           + eosJMDCFw(3)*t2
     &           + eosJMDCFw(4)*t3
     &           + eosJMDCFw(5)*t4
     &           + eosJMDCFw(6)*t4*t
            rsalt =
     &         s*(
     &             eosJMDCSw(1)
     &           + eosJMDCSw(2)*t
     &           + eosJMDCSw(3)*t2
     &           + eosJMDCSw(4)*t3
     &           + eosJMDCSw(5)*t4
     &           )
     &       + s3o2*(
     &             eosJMDCSw(6)
     &           + eosJMDCSw(7)*t
     &           + eosJMDCSw(8)*t2
     &           )
     &           + eosJMDCSw(9)*s*s
            rhoP0(i,j) = rfresh + rsalt
         ENDDO
      ENDDO
      RETURN
      END
      SUBROUTINE FIND_BULKMOD(
     I                iMin, iMax, jMin, jMax,
     I                locPres, tFld, sFld,
     O                bulkMod,
     I                myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      Real*8 SItoBar, SItodBar
      PARAMETER ( SItoBar  = 1.D-05 )
      PARAMETER ( SItodBar = 1.D-04 )
      COMMON /PARM_EOS_LIN/ tAlpha,sBeta,equationOfState
      Real*8 tAlpha
      Real*8 sBeta
      character*(6) equationOfState
      COMMON /PARM_EOS_NL/ eosC,eosSig0,eosRefT,eosRefS
      Real*8 eosC(9,Nr+1),eosSig0(Nr+1),eosRefT(Nr+1),eosRefS(Nr+1)
      Real*8 eosJMDCFw(6), eosJMDCSw(9)
      Real*8 eosJMDCKFw(5), eosJMDCKSw(7), eosJMDCKP(14)
      COMMON /PARM_EOS_JMD95/
     &     eosJMDCFw, eosJMDCSw, eosJMDCKFw, eosJMDCKSw, eosJMDCKP
      Real*8 eosMDJWFnum(0:11), eosMDJWFden(0:12)
      COMMON /PARM_EOS_MDJWF/ 
     &     eosMDJWFnum, eosMDJWFden
      INTEGER iMin,iMax,jMin,jMax
      Real*8 locPres(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 tFld   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 sFld   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 bulkMod(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      INTEGER myThid
      INTEGER i,j
      Real*8 bMfresh, bMsalt, bMpres
      Real*8 t, t2, t3, t4, s, s3o2, p, p2
      DO j=jMin,jMax
         DO i=iMin,iMax
            t  = tFld(i,j)
            t2 = t*t
            t3 = t2*t
            t4 = t3*t
            s  = sFld(i,j)
          IF ( s .GT. 0.d0 ) THEN
            s3o2 = s*SQRT(s)
          ELSE
            s    = 0.d0
            s3o2 = 0.d0
          ENDIF
C
            p = locPres(i,j)*SItoBar
            p2 = p*p
            bMfresh =
     &             eosJMDCKFw(1)
     &           + eosJMDCKFw(2)*t
     &           + eosJMDCKFw(3)*t2
     &           + eosJMDCKFw(4)*t3
     &           + eosJMDCKFw(5)*t4
            bMsalt =
     &         s*( eosJMDCKSw(1)
     &           + eosJMDCKSw(2)*t
     &           + eosJMDCKSw(3)*t2
     &           + eosJMDCKSw(4)*t3
     &           )
     &    + s3o2*( eosJMDCKSw(5)
     &           + eosJMDCKSw(6)*t
     &           + eosJMDCKSw(7)*t2
     &           )
            bMpres =
     &         p*( eosJMDCKP(1)
     &           + eosJMDCKP(2)*t
     &           + eosJMDCKP(3)*t2
     &           + eosJMDCKP(4)*t3
     &           )
     &     + p*s*( eosJMDCKP(5)
     &           + eosJMDCKP(6)*t
     &           + eosJMDCKP(7)*t2
     &           )
     &      + p*s3o2*eosJMDCKP(8)
     &      + p2*( eosJMDCKP(9)
     &           + eosJMDCKP(10)*t
     &           + eosJMDCKP(11)*t2
     &           )
     &    + p2*s*( eosJMDCKP(12)
     &           + eosJMDCKP(13)*t
     &           + eosJMDCKP(14)*t2
     &           )
            bulkMod(i,j) = bMfresh + bMsalt + bMpres
         ENDDO
      ENDDO
      RETURN
      END
      SUBROUTINE FIND_RHONUM(
     I                iMin, iMax, jMin, jMax,
     I                locPres, tFld, sFld,
     O                rhoNum,
     I                myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      Real*8 SItoBar, SItodBar
      PARAMETER ( SItoBar  = 1.D-05 )
      PARAMETER ( SItodBar = 1.D-04 )
      COMMON /PARM_EOS_LIN/ tAlpha,sBeta,equationOfState
      Real*8 tAlpha
      Real*8 sBeta
      character*(6) equationOfState
      COMMON /PARM_EOS_NL/ eosC,eosSig0,eosRefT,eosRefS
      Real*8 eosC(9,Nr+1),eosSig0(Nr+1),eosRefT(Nr+1),eosRefS(Nr+1)
      Real*8 eosJMDCFw(6), eosJMDCSw(9)
      Real*8 eosJMDCKFw(5), eosJMDCKSw(7), eosJMDCKP(14)
      COMMON /PARM_EOS_JMD95/
     &     eosJMDCFw, eosJMDCSw, eosJMDCKFw, eosJMDCKSw, eosJMDCKP
      Real*8 eosMDJWFnum(0:11), eosMDJWFden(0:12)
      COMMON /PARM_EOS_MDJWF/ 
     &     eosMDJWFnum, eosMDJWFden
      INTEGER iMin,iMax,jMin,jMax
      Real*8 locPres(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 tFld   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 sFld   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rhoNum (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      INTEGER myThid
      INTEGER i,j
      Real*8 t1, t2, s1, p1
      DO j=jMin,jMax
         DO i=iMin,iMax
            t1  = tFld(i,j)
            t2 = t1*t1
            s1  = sFld(i,j)
            p1   = locPres(i,j)*SItodBar
            rhoNum(i,j) = eosMDJWFnum(0)
     &           + t1*(eosMDJWFnum(1)
     &           +     t1*(eosMDJWFnum(2) + eosMDJWFnum(3)*t1) )
     &           + s1*(eosMDJWFnum(4)
     &           +     eosMDJWFnum(5)*t1  + eosMDJWFnum(6)*s1)
     &           + p1*(eosMDJWFnum(7) + eosMDJWFnum(8)*t2
     &           +     eosMDJWFnum(9)*s1
     &           +     p1*(eosMDJWFnum(10) + eosMDJWFnum(11)*t2) )
         ENDDO
      ENDDO
      RETURN
      END
      SUBROUTINE FIND_RHODEN(
     I                iMin, iMax, jMin, jMax,
     I                locPres, tFld, sFld,
     O                rhoDen,
     I                myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      Real*8 SItoBar, SItodBar
      PARAMETER ( SItoBar  = 1.D-05 )
      PARAMETER ( SItodBar = 1.D-04 )
      COMMON /PARM_EOS_LIN/ tAlpha,sBeta,equationOfState
      Real*8 tAlpha
      Real*8 sBeta
      character*(6) equationOfState
      COMMON /PARM_EOS_NL/ eosC,eosSig0,eosRefT,eosRefS
      Real*8 eosC(9,Nr+1),eosSig0(Nr+1),eosRefT(Nr+1),eosRefS(Nr+1)
      Real*8 eosJMDCFw(6), eosJMDCSw(9)
      Real*8 eosJMDCKFw(5), eosJMDCKSw(7), eosJMDCKP(14)
      COMMON /PARM_EOS_JMD95/
     &     eosJMDCFw, eosJMDCSw, eosJMDCKFw, eosJMDCKSw, eosJMDCKP
      Real*8 eosMDJWFnum(0:11), eosMDJWFden(0:12)
      COMMON /PARM_EOS_MDJWF/ 
     &     eosMDJWFnum, eosMDJWFden
      INTEGER iMin,iMax,jMin,jMax
      Real*8 locPres(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 tFld   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 sFld   (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rhoDen (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      INTEGER myThid
      INTEGER i,j
      Real*8 t1, t2, s1, sp5, p1, p1t1
      Real*8 den, epsln
      parameter ( epsln = 0.d0 )
      DO j=jMin,jMax
         DO i=iMin,iMax
            t1  = tFld(i,j)
            t2 = t1*t1
            s1  = sFld(i,j)
           IF ( s1 .GT. 0.d0 ) THEN
            sp5 = SQRT(s1)
           ELSE
            s1  = 0.d0
            sp5 = 0.d0
           ENDIF
            p1   = locPres(i,j)*SItodBar
            p1t1 = p1*t1
            den = eosMDJWFden(0)
     &           + t1*(eosMDJWFden(1)
     &           +     t1*(eosMDJWFden(2)
     &           +         t1*(eosMDJWFden(3) + t1*eosMDJWFden(4) ) ) )
     &           + s1*(eosMDJWFden(5)
     &           +     t1*(eosMDJWFden(6)
     &           +         eosMDJWFden(7)*t2)
     &           +     sp5*(eosMDJWFden(8) + eosMDJWFden(9)*t2) )
     &           + p1*(eosMDJWFden(10)
     &           +     p1t1*(eosMDJWFden(11)*t2 + eosMDJWFden(12)*p1) )
            rhoDen(i,j) = 1.0/(epsln+den)
         ENDDO
      ENDDO
      RETURN
      END
      SUBROUTINE FIND_RHO_SCALAR(
     I     tLoc, sLoc, pLoc,
     O     rhoLoc,
     I     myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      Real*8 SItoBar, SItodBar
      PARAMETER ( SItoBar  = 1.D-05 )
      PARAMETER ( SItodBar = 1.D-04 )
      COMMON /PARM_EOS_LIN/ tAlpha,sBeta,equationOfState
      Real*8 tAlpha
      Real*8 sBeta
      character*(6) equationOfState
      COMMON /PARM_EOS_NL/ eosC,eosSig0,eosRefT,eosRefS
      Real*8 eosC(9,Nr+1),eosSig0(Nr+1),eosRefT(Nr+1),eosRefS(Nr+1)
      Real*8 eosJMDCFw(6), eosJMDCSw(9)
      Real*8 eosJMDCKFw(5), eosJMDCKSw(7), eosJMDCKP(14)
      COMMON /PARM_EOS_JMD95/
     &     eosJMDCFw, eosJMDCSw, eosJMDCKFw, eosJMDCKSw, eosJMDCKP
      Real*8 eosMDJWFnum(0:11), eosMDJWFden(0:12)
      COMMON /PARM_EOS_MDJWF/ 
     &     eosMDJWFnum, eosMDJWFden
      Real*8 tLoc, sLoc, pLoc
      Real*8 rhoLoc
      INTEGER myThid
      Real*8 t1, t2, t3, t4, s1, s3o2, p1, p2, sp5, p1t1
      Real*8 rfresh, rsalt, rhoP0
      Real*8 bMfresh, bMsalt, bMpres, BulkMod
      Real*8 rhoNum, rhoDen, den, epsln
      PARAMETER ( epsln = 0.d0 )
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      rhoLoc  = 0.d0
      rhoP0   = 0.d0
      bulkMod = 0.d0
      rfresh  = 0.d0
      rsalt   = 0.d0
      bMfresh = 0.d0
      bMsalt  = 0.d0
      bMpres  = 0.d0
      rhoNum  = 0.d0
      rhoDen  = 0.d0
      den     = 0.d0
      t1 = tLoc
      t2 = t1*t1
      t3 = t2*t1
      t4 = t3*t1
      s1  = sLoc
      IF ( s1 .LT. 0.d0 ) THEN
         WRITE(msgBuf,'(A,E13.5)')
     &        ' FIND_RHO_SCALAR:   WARNING, salinity = ', s1
         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
     &                       SQUEEZE_RIGHT , myThid )
         s1 = 0.d0
      ENDIF
      IF (equationOfState.EQ.'LINEAR') THEN
         rholoc = rhoNil*(
     &                      sBeta *(sLoc-sRef(1))
     &                     -tAlpha*(tLoc-tRef(1))
     &                   ) + rhoNil
      ELSEIF (equationOfState.EQ.'POLY3') THEN
         WRITE(msgBuf,'(A)')
     &        ' FIND_RHO_SCALAR: for POLY3, the density is not'
         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
     &                       SQUEEZE_RIGHT , myThid )
         WRITE(msgBuf,'(A)')
     &         '                 computed correctly in this routine'
         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
     &                       SQUEEZE_RIGHT , myThid )
         rhoLoc = 0.d0
      ELSEIF ( equationOfState(1:5).EQ.'JMD95'
     &      .OR. equationOfState.EQ.'UNESCO' ) THEN
         s3o2 = s1*SQRT(s1)
         p1 = pLoc*SItoBar
         p2 = p1*p1
         rfresh =
     &          eosJMDCFw(1)
     &        + eosJMDCFw(2)*t1
     &        + eosJMDCFw(3)*t2
     &        + eosJMDCFw(4)*t3
     &        + eosJMDCFw(5)*t4
     &        + eosJMDCFw(6)*t4*t1
         rsalt =
     &        s1*(
     &             eosJMDCSw(1)
     &           + eosJMDCSw(2)*t1
     &           + eosJMDCSw(3)*t2
     &           + eosJMDCSw(4)*t3
     &           + eosJMDCSw(5)*t4
     &           )
     &        + s3o2*(
     &             eosJMDCSw(6)
     &           + eosJMDCSw(7)*t1
     &           + eosJMDCSw(8)*t2
     &           )
     &           + eosJMDCSw(9)*s1*s1
         rhoP0 = rfresh + rsalt
         bMfresh =
     &             eosJMDCKFw(1)
     &           + eosJMDCKFw(2)*t1
     &           + eosJMDCKFw(3)*t2
     &           + eosJMDCKFw(4)*t3
     &           + eosJMDCKFw(5)*t4
         bMsalt =
     &        s1*( eosJMDCKSw(1)
     &           + eosJMDCKSw(2)*t1
     &           + eosJMDCKSw(3)*t2
     &           + eosJMDCKSw(4)*t3
     &           )
     &    + s3o2*( eosJMDCKSw(5)
     &           + eosJMDCKSw(6)*t1
     &           + eosJMDCKSw(7)*t2
     &           )
         bMpres =
     &        p1*( eosJMDCKP(1)
     &           + eosJMDCKP(2)*t1
     &           + eosJMDCKP(3)*t2
     &           + eosJMDCKP(4)*t3
     &           )
     &   + p1*s1*( eosJMDCKP(5)
     &           + eosJMDCKP(6)*t1
     &           + eosJMDCKP(7)*t2
     &           )
     &      + p1*s3o2*eosJMDCKP(8)
     &      + p2*( eosJMDCKP(9)
     &           + eosJMDCKP(10)*t1
     &           + eosJMDCKP(11)*t2
     &           )
     &    + p2*s1*( eosJMDCKP(12)
     &           + eosJMDCKP(13)*t1
     &           + eosJMDCKP(14)*t2
     &           )
         bulkMod = bMfresh + bMsalt + bMpres
         rhoLoc = rhoP0/(1.d0 - p1/bulkMod)
      ELSEIF ( equationOfState.EQ.'MDJWF' ) THEN
         sp5 = SQRT(s1)
         p1   = pLoc*SItodBar
         p1t1 = p1*t1
         rhoNum = eosMDJWFnum(0)
     &        + t1*(eosMDJWFnum(1)
     &        +     t1*(eosMDJWFnum(2) + eosMDJWFnum(3)*t1) )
     &        + s1*(eosMDJWFnum(4)
     &        +     eosMDJWFnum(5)*t1  + eosMDJWFnum(6)*s1)
     &        + p1*(eosMDJWFnum(7) + eosMDJWFnum(8)*t2
     &        +     eosMDJWFnum(9)*s1
     &        +     p1*(eosMDJWFnum(10) + eosMDJWFnum(11)*t2) )
         den = eosMDJWFden(0)
     &        + t1*(eosMDJWFden(1)
     &        +     t1*(eosMDJWFden(2)
     &        +         t1*(eosMDJWFden(3) + t1*eosMDJWFden(4) ) ) )
     &        + s1*(eosMDJWFden(5)
     &        +     t1*(eosMDJWFden(6)
     &        +         eosMDJWFden(7)*t2)
     &        +     sp5*(eosMDJWFden(8) + eosMDJWFden(9)*t2) )
     &        + p1*(eosMDJWFden(10)
     &        +     p1t1*(eosMDJWFden(11)*t2 + eosMDJWFden(12)*p1) )
         rhoDen = 1.0/(epsln+den)
         rhoLoc = rhoNum*rhoDen
      ELSEIF( equationOfState .EQ. 'IDEALG' ) THEN
C
      ELSE
       WRITE(msgBuf,'(3A)')
     &        ' FIND_RHO_SCALAR : equationOfState = "',
     &        equationOfState,'"'
       CALL PRINT_ERROR( msgBuf, myThid )
       STOP 'ABNORMAL END: S/R FIND_RHO_SCALAR'
      ENDIF
      RETURN
      END
      SUBROUTINE LOOK_FOR_NEG_SALINITY(
     I                iMin, iMax, jMin, jMax,
     U                sFld,
     I                k, bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER iMin,iMax,jMin,jMax
      Real*8     sFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER k, bi, bj
      INTEGER myThid
      INTEGER i,j, localWarning
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      localWarning = 0
      DO j=jMin,jMax
       DO i=iMin,iMax
        IF ( sFld(i,j) .LT. 0.d0 ) THEN
         localWarning = localWarning + 1
         sFld(i,j) = 0.d0
        ENDIF
       ENDDO
      ENDDO
      IF ( localWarning .GT. 0 ) THEN
        WRITE(msgBuf,'(2A,I5,A,2I4)') 'S/R LOOK_FOR_NEG_SALINITY:',
     &      ' from level k =', k, ' ; bi,bj =', bi, bj
        CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                      SQUEEZE_RIGHT , myThid )
        WRITE(msgBuf,'(2A,I6,A)') 'S/R LOOK_FOR_NEG_SALINITY:',
     &      ' reset to zero', localWarning, ' negative salinity.'
        CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                      SQUEEZE_RIGHT , myThid )
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
 
      SUBROUTINE FORWARD_STEP( iloop, myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      integer i_got_signal
      common / sig_i / i_got_signal
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
c
c
      common /ctrl_dummy/
     &                    xx_theta_dummy
     &                  , xx_salt_dummy
     &                  , xx_hflux_dummy
     &                  , xx_sflux_dummy
     &                  , xx_tauu_dummy
     &                  , xx_tauv_dummy
     &                  , xx_atemp_dummy
     &                  , xx_aqh_dummy
     &                  , xx_precip_dummy
     &                  , xx_swflux_dummy
     &                  , xx_swdown_dummy
     &                  , xx_snowprecip_dummy
     &                  , xx_lwflux_dummy
     &                  , xx_lwdown_dummy
     &                  , xx_evap_dummy
     &                  , xx_apressure_dummy
     &                  , xx_runoff_dummy
     &                  , xx_uwind_dummy
     &                  , xx_vwind_dummy
     &                  , xx_obcsn_dummy
     &                  , xx_obcss_dummy
     &                  , xx_obcsw_dummy
     &                  , xx_obcse_dummy
     &                  , xx_diffkr_dummy
     &                  , xx_kapgm_dummy
     &                  , xx_kapredi_dummy
     &                  , xx_tr1_dummy
     &                  , xx_sst_dummy
     &                  , xx_sss_dummy
     &                  , xx_depth_dummy
     &                  , xx_efluxy_dummy
     &                  , xx_efluxp_dummy
     &                  , xx_bottomdrag_dummy
     &                  , xx_edtaux_dummy
     &                  , xx_edtauy_dummy
     &                  , xx_uvel_dummy
     &                  , xx_vvel_dummy
     &                  , xx_etan_dummy
     &                  , xx_siarea_dummy
     &                  , xx_siheff_dummy
     &                  , xx_sihsnow_dummy
     &                  , xx_relaxsst_dummy
     &                  , xx_relaxsss_dummy
     &                  , xx_tbar_mean_dummy
     &                  , xx_tbar_daily_mean_dummy
     &                  , xx_sbar_mean_dummy
     &                  , xx_sbar_daily_mean_dummy
     &                  , xx_ubar_mean_dummy
     &                  , xx_vbar_mean_dummy
     &                  , xx_wbar_mean_dummy
     &                  , xx_psbar_mean_dummy
     &                  , xx_bpbar_mean_dummy
     &                  , xx_taux_mean_dummy
     &                  , xx_tauy_mean_dummy
     &                  , xx_hflux_mean_dummy
     &                  , xx_sflux_mean_dummy
     &                  , xx_sstbar_mean_dummy
     &                  , xx_sssbar_mean_dummy
     &                  , xx_atemp_mean_dummy
     &                  , xx_aqh_mean_dummy
     &                  , xx_precip_mean_dummy
     &                  , xx_swflux_mean_dummy
     &                  , xx_swdown_mean_dummy
     &                  , xx_snowprecip_mean_dummy
     &                  , xx_lwflux_mean_dummy
     &                  , xx_lwdown_mean_dummy
     &                  , xx_evap_mean_dummy
     &                  , xx_apressure_mean_dummy
     &                  , xx_runoff_mean_dummy
     &                  , xx_uwind_mean_dummy
     &                  , xx_vwind_mean_dummy
     &                  , xx_theta_ini_fin_dummy
     &                  , xx_salt_ini_fin_dummy
     &                  , xx_smrareabar_mean_dummy
     &                  , xx_smrsstbar_mean_dummy
     &                  , xx_smrsssbar_mean_dummy
     &                  , xx_gen2d_dummy
     &                  , xx_gen3d_dummy
cHFLUXM_CONTROL
     &                  , xx_hfluxm_dummy
cHFLUXM_CONTROL
      Real*8 xx_theta_dummy
      Real*8 xx_salt_dummy
      Real*8 xx_hflux_dummy
      Real*8 xx_sflux_dummy
      Real*8 xx_tauu_dummy
      Real*8 xx_tauv_dummy
      Real*8 xx_atemp_dummy
      Real*8 xx_aqh_dummy
      Real*8 xx_precip_dummy
      Real*8 xx_swflux_dummy
      Real*8 xx_swdown_dummy
      Real*8 xx_snowprecip_dummy
      Real*8 xx_lwflux_dummy
      Real*8 xx_lwdown_dummy
      Real*8 xx_evap_dummy
      Real*8 xx_apressure_dummy
      Real*8 xx_runoff_dummy
      Real*8 xx_uwind_dummy
      Real*8 xx_vwind_dummy
      Real*8 xx_obcsn_dummy
      Real*8 xx_obcss_dummy
      Real*8 xx_obcsw_dummy
      Real*8 xx_obcse_dummy
      Real*8 xx_diffkr_dummy
      Real*8 xx_kapgm_dummy
      Real*8 xx_kapredi_dummy
      Real*8 xx_tr1_dummy
      Real*8 xx_sst_dummy
      Real*8 xx_sss_dummy
      Real*8 xx_depth_dummy
      Real*8 xx_efluxy_dummy
      Real*8 xx_efluxp_dummy
      Real*8 xx_bottomdrag_dummy
      Real*8 xx_edtaux_dummy
      Real*8 xx_edtauy_dummy
      Real*8 xx_uvel_dummy
      Real*8 xx_vvel_dummy
      Real*8 xx_etan_dummy
      Real*8 xx_siarea_dummy
      Real*8 xx_siheff_dummy
      Real*8 xx_sihsnow_dummy
      Real*8 xx_relaxsst_dummy
      Real*8 xx_relaxsss_dummy
      Real*8 xx_gen2d_dummy
      Real*8 xx_gen3d_dummy
c
      Real*8 xx_tbar_mean_dummy
      Real*8 xx_tbar_daily_mean_dummy
      Real*8 xx_sbar_mean_dummy
      Real*8 xx_sbar_daily_mean_dummy
      Real*8 xx_ubar_mean_dummy
      Real*8 xx_vbar_mean_dummy
      Real*8 xx_wbar_mean_dummy
      Real*8 xx_psbar_mean_dummy
      Real*8 xx_bpbar_mean_dummy
      Real*8 xx_hflux_mean_dummy
      Real*8 xx_sflux_mean_dummy
      Real*8 xx_sstbar_mean_dummy
      Real*8 xx_sssbar_mean_dummy
      Real*8 xx_taux_mean_dummy
      Real*8 xx_tauy_mean_dummy
      Real*8 xx_atemp_mean_dummy
      Real*8 xx_aqh_mean_dummy
      Real*8 xx_precip_mean_dummy
      Real*8 xx_swflux_mean_dummy
      Real*8 xx_swdown_mean_dummy
      Real*8 xx_snowprecip_mean_dummy
      Real*8 xx_lwflux_mean_dummy
      Real*8 xx_lwdown_mean_dummy
      Real*8 xx_evap_mean_dummy
      Real*8 xx_apressure_mean_dummy
      Real*8 xx_runoff_mean_dummy
      Real*8 xx_uwind_mean_dummy
      Real*8 xx_vwind_mean_dummy
      Real*8 xx_theta_ini_fin_dummy
      Real*8 xx_salt_ini_fin_dummy
      Real*8 xx_smrareabar_mean_dummy
      Real*8 xx_smrsstbar_mean_dummy
      Real*8 xx_smrsssbar_mean_dummy
cHFLUXM_CONTROL
      Real*8 xx_hfluxm_dummy
cHFLUXM_CONTROL
c
c
c
c
c
      common /cost_r/
     &                fc
      Real*8  fc
      common /cost_objf/
     &                objf_atl,
     &                objf_test,
     &                objf_tracer,
     &                objf_entropy,
     &                objf_t_misfit,
     &                objf_eflux
cHFLUXM_CONTROL
     &               ,objf_hflux_tut
     &               ,objf_temp_tut
cHFLUXM_CONTROL
      Real*8  objf_atl  (nsx,nsy)
      Real*8  objf_test (nsx,nsy)
      Real*8  objf_tracer (nsx,nsy)
      Real*8  objf_entropy (nsx,nsy)
      Real*8  objf_t_misfit (nsx,nsy)
      Real*8  objf_eflux (nsx,nsy)
cHFLUXM_CONTROL
      Real*8  objf_hflux_tut (nsx,nsy)
      Real*8  objf_temp_tut (nsx,nsy)
cHFLUXM_CONTROL
      common /cost_param_r/
     &                lastinterval
      Real*8 lastinterval
      common /cost_aux_r/
     &                    mult_atl,
     &                    mult_test,
     &                    mult_tracer,
     &                    mult_entropy,
     &                    mult_t_misfit,
     &                    mult_eflux,
     &                    multTheta,
     &                    multSalt,
     &                    multUvel,
     &                    multVvel,
     &                    multEtan
cHFLUXM_CONTROL
     &                   ,mult_hflux_tut
     &                   ,mult_temp_tut
cHFLUXM_CONTROL
      Real*8  mult_atl
      Real*8  mult_test
      Real*8  mult_tracer
      Real*8  mult_entropy
      Real*8  mult_t_misfit
      Real*8  mult_eflux
      Real*8  multTheta
      Real*8  multSalt
      Real*8  multUvel
      Real*8  multVvel
      Real*8  multEtan
cHFLUXM_CONTROL
      Real*8  mult_hflux_tut
      Real*8  mult_temp_tut
cHFLUXM_CONTROL
      COMMON /COST_MEAN_R/
     &                     cMeanTheta, cMeanUVel, cMeanVVel,
     &                     cMeanThetaUVel, cMeanThetaVVel
      Real*8 cMeanTheta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 SItoBar, SItodBar
      PARAMETER ( SItoBar  = 1.D-05 )
      PARAMETER ( SItodBar = 1.D-04 )
      COMMON /PARM_EOS_LIN/ tAlpha,sBeta,equationOfState
      Real*8 tAlpha
      Real*8 sBeta
      character*(6) equationOfState
      COMMON /PARM_EOS_NL/ eosC,eosSig0,eosRefT,eosRefS
      Real*8 eosC(9,Nr+1),eosSig0(Nr+1),eosRefT(Nr+1),eosRefS(Nr+1)
      Real*8 eosJMDCFw(6), eosJMDCSw(9)
      Real*8 eosJMDCKFw(5), eosJMDCKSw(7), eosJMDCKP(14)
      COMMON /PARM_EOS_JMD95/
     &     eosJMDCFw, eosJMDCSw, eosJMDCKFw, eosJMDCKSw, eosJMDCKP
      Real*8 eosMDJWFnum(0:11), eosMDJWFden(0:12)
      COMMON /PARM_EOS_MDJWF/ 
     &     eosMDJWFnum, eosMDJWFden
      COMMON /DYNVARS_CD/
     &                   uVelD, vVelD,
     &                   etaNm1,
     &                   uNM1,  vNM1
      Real*8  uVelD (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVelD (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  etaNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uNM1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vNM1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 op5
      Real*8 op25
      PARAMETER( op5  = 0.5 D 0 )
      PARAMETER( op25 = 0.25 D 0 )
      LOGICAL GM_AdvForm
      LOGICAL GM_AdvSeparate
      LOGICAL GM_ExtraDiag
      LOGICAL GM_InMomAsStress
      LOGICAL GM_MNC
      LOGICAL GM_MDSIO
      COMMON /GM_PARAMS_L/
     &                   GM_AdvForm, GM_AdvSeparate,
     &                   GM_ExtraDiag, GM_MNC, GM_MDSIO,
     &                   GM_InMomAsStress
      CHARACTER*(40) GM_taper_scheme
      COMMON /GM_PARAMS_C/
     &                   GM_taper_scheme
      Real*8 GM_isopycK
      Real*8 GM_background_K
      Real*8 GM_maxSlope
      Real*8 GM_Kmin_horiz
      Real*8 GM_Small_Number
      Real*8 GM_slopeSqCutoff
      Real*8 GM_Visbeck_alpha
      Real*8 GM_Visbeck_length
      Real*8 GM_Visbeck_depth
      Real*8 GM_Visbeck_minDepth
      Real*8 GM_Visbeck_maxSlope
      Real*8 GM_Visbeck_minVal_K
      Real*8 GM_Visbeck_maxVal_K
      Real*8 GM_facTrL2dz
      Real*8 GM_facTrL2ML
      Real*8 GM_maxTransLay
      Real*8 GM_Scrit
      Real*8 GM_Sd
      COMMON /GM_PARAMS_R/
     &                   GM_isopycK, GM_background_K,
     &                   GM_maxSlope,
     &                   GM_Kmin_horiz,
     &                   GM_Small_Number, GM_slopeSqCutoff,
     &                   GM_Visbeck_alpha, GM_Visbeck_length,
     &                   GM_Visbeck_depth,
     &                   GM_Visbeck_minDepth, GM_Visbeck_maxSlope,
     &                   GM_Visbeck_minVal_K, GM_Visbeck_maxVal_K,
     &                   GM_facTrL2dz, GM_facTrL2ML, GM_maxTransLay,
     &                   GM_Scrit, GM_Sd
      Real*8 GM_rMaxSlope
      Real*8 GM_skewflx
      Real*8 GM_advect
      COMMON /GM_DERIVED_PAR/
     &                   GM_rMaxSlope,
     &                   GM_skewflx, GM_advect
      Real*8 Kwx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_Wtensor/ Kwx,Kwy,Kwz
      Real*8 Kux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_HorTensor/ Kux,Kvy
      Real*8 Kuz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_UVtensor/ Kuz,Kvz
      INTEGER iloop
      Real*8     myTime
      INTEGER myIter
      INTEGER myThid
      LOGICAL modelEnd
      IF ( debugLevel .GE. debLevB )
     &    CALL DEBUG_ENTER('FORWARD_STEP',myThid)
      CALL AUTODIFF_INADMODE_UNSET( myThid )
      myIter = nIter0 + (iloop-1)
      myTime = startTime + float(iloop-1)*deltaTclock
c
c
c
CADJ STORE totphihyd = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE pmepr = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE uveld     = comlev1, key = ikey_dynamics, kind = isbyte
CADJ STORE vveld     = comlev1, key = ikey_dynamics, kind = isbyte
CADJ STORE unm1      = comlev1, key = ikey_dynamics, kind = isbyte
CADJ STORE vnm1      = comlev1, key = ikey_dynamics, kind = isbyte
CADJ STORE taux0   = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE taux1   = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE tauy0   = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE tauy1   = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE Qnet0   = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE Qnet1   = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE EmPmR0  = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE EmPmR1  = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE SST0    = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE SST1    = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE SSS0    = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE SSS1    = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE saltFlux0    = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE saltFlux1    = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE cMeanThetaUVel = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE cMeanThetaVVel = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
c
c
c
      IF ( debugLevel .GE. debLevB )
     & CALL DEBUG_CALL('LOAD_FIELDS_DRIVER',myThid)
CADJ STORE theta      = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE uvel, vvel = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
      CALL TIMER_START('LOAD_FIELDS_DRIVER  [FORWARD_STEP]',myThid)
      CALL LOAD_FIELDS_DRIVER( myTime, myIter, myThid )
      CALL TIMER_STOP ('LOAD_FIELDS_DRIVER  [FORWARD_STEP]',myThid)
      IF ( myIter .EQ. nIter0 )
     &     CALL CTRL_MAP_FORCING (myThid)
      IF ( debugLevel .GE. debLevB )
     & CALL DEBUG_CALL('DO_ATMOSPHERIC_PHYS',myThid)
      CALL TIMER_START('DO_ATMOSPHERIC_PHYS [FORWARD_STEP]',myThid)
      CALL DO_ATMOSPHERIC_PHYS( myTime, myIter, myThid )
      CALL TIMER_STOP ('DO_ATMOSPHERIC_PHYS [FORWARD_STEP]',myThid)
CADJ STORE surfaceforcingtice = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
       IF ( debugLevel .GE. debLevB )
     &    CALL DEBUG_CALL('DO_OCEANIC_PHYS',myThid)
       CALL TIMER_START('DO_OCEANIC_PHYS     [FORWARD_STEP]',myThid)
       CALL DO_OCEANIC_PHYS( myTime, myIter, myThid )
       CALL TIMER_STOP ('DO_OCEANIC_PHYS     [FORWARD_STEP]',myThid)
CADJ STORE EmPmR    = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE pmepr    = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
c
CADJ STORE rhoInSitu          = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE surfaceForcingS    = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE surfaceForcingT    = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE surfaceForcingTice = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE IVDConvCount       = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
c
CADJ STORE Kwx                = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE Kwy                = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
CADJ STORE Kwz                = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
c
c
      IF ( .NOT.staggerTimeStep ) THEN
        IF ( debugLevel .GE. debLevB )
     &    CALL DEBUG_CALL('THERMODYNAMICS',myThid)
CADJ STORE salt               = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
        CALL TIMER_START('THERMODYNAMICS      [FORWARD_STEP]',myThid)
        CALL THERMODYNAMICS( myTime, myIter, myThid )
        CALL TIMER_STOP ('THERMODYNAMICS      [FORWARD_STEP]',myThid)
      ENDIF
      IF ( implicitIntGravWave ) THEN
        CALL TIMER_START('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
        CALL DO_STAGGER_FIELDS_EXCHANGES( myTime, myIter, myThid )
        CALL TIMER_STOP ('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
      ENDIF
        IF ( debugLevel .GE. debLevB )
     &    CALL DEBUG_CALL('DYNAMICS',myThid)
        CALL TIMER_START('DYNAMICS            [FORWARD_STEP]',myThid)
        CALL DYNAMICS( myTime, myIter, myThid )
        CALL TIMER_STOP ('DYNAMICS            [FORWARD_STEP]',myThid)
      myIter = nIter0 + iLoop
      myTime = startTime + deltaTClock * float(iLoop)
      IF ( momStepping ) THEN
        CALL TIMER_START('SOLVE_FOR_PRESSURE  [FORWARD_STEP]',myThid)
        CALL SOLVE_FOR_PRESSURE(myTime, myIter, myThid)
        CALL TIMER_STOP ('SOLVE_FOR_PRESSURE  [FORWARD_STEP]',myThid)
      ENDIF
        CALL TIMER_START('MOM_CORRECTION_STEP [FORWARD_STEP]',myThid)
        CALL MOMENTUM_CORRECTION_STEP(myTime, myIter, myThid)
        CALL TIMER_STOP ('MOM_CORRECTION_STEP [FORWARD_STEP]',myThid)
      IF (exactConserv) THEN
        CALL TIMER_START('UPDATE_ETAH         [FORWARD_STEP]',myThid)
        CALL UPDATE_ETAH( myTime, myIter, myThid )
        CALL TIMER_STOP ('UPDATE_ETAH         [FORWARD_STEP]',myThid)
      ENDIF
      IF ( staggerTimeStep ) THEN
        IF ( debugLevel .GE. debLevB )
     &   CALL DEBUG_CALL('DO_STAGGER_FIELDS_EXCH.',myThid)
        CALL TIMER_START('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
        CALL DO_STAGGER_FIELDS_EXCHANGES( myTime, myIter, myThid )
        CALL TIMER_STOP ('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
        IF ( debugLevel .GE. debLevB )
     &   CALL DEBUG_CALL('THERMODYNAMICS',myThid)
        CALL TIMER_START('THERMODYNAMICS      [FORWARD_STEP]',myThid)
        CALL THERMODYNAMICS( myTime, myIter, myThid )
        CALL TIMER_STOP ('THERMODYNAMICS      [FORWARD_STEP]',myThid)
      ENDIF
CADJ STORE totphihyd  = comlev1, key = ikey_dynamics,
CADJ &     kind = isbyte
      CALL TIMER_START('TRC_CORRECTION_STEP [FORWARD_STEP]',myThid)
      CALL TRACERS_CORRECTION_STEP(myTime, myIter, myThid)
      CALL TIMER_STOP ('TRC_CORRECTION_STEP [FORWARD_STEP]',myThid)
      CALL TIMER_START('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
      CALL DO_FIELDS_BLOCKING_EXCHANGES( myThid )
      CALL TIMER_STOP ('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
      CALL TIMER_START('DO_STATEVARS_TAVE   [FORWARD_STEP]',myThid)
      CALL DO_STATEVARS_TAVE( myTime, myIter, myThid )
      CALL TIMER_STOP ('DO_STATEVARS_TAVE   [FORWARD_STEP]',myThid)
      IF ( .NOT.useOffLine ) THEN
        CALL TIMER_START('MONITOR             [FORWARD_STEP]',myThid)
        CALL MONITOR( myTime, myIter, myThid )
        CALL TIMER_STOP ('MONITOR             [FORWARD_STEP]',myThid)
      ENDIF
      CALL TIMER_START('COST_TILE           [FORWARD_STEP]',myThid)
      CALL COST_TILE  ( myTime, myIter, myThid )
      CALL TIMER_STOP ('COST_TILE           [FORWARD_STEP]',myThid)
      modelEnd = myTime.EQ.endTime .OR. myIter.EQ.nEndIter
      IF ( useSIGREG ) THEN
        modelEnd = modelEnd .OR. ( i_got_signal.GT.0 )
      ENDIF
      CALL TIMER_START('DO_THE_MODEL_IO     [FORWARD_STEP]',myThid)
      CALL DO_THE_MODEL_IO( modelEnd, myTime, myIter, myThid )
      CALL TIMER_STOP ('DO_THE_MODEL_IO     [FORWARD_STEP]',myThid)
      CALL TIMER_START('DO_WRITE_PICKUP     [FORWARD_STEP]',myThid)
      CALL DO_WRITE_PICKUP( modelEnd, myTime, myIter, myThid )
      CALL TIMER_STOP ('DO_WRITE_PICKUP     [FORWARD_STEP]',myThid)
      IF ( useSIGREG ) THEN
        IF ( modelEnd .AND. i_got_signal.GT.0 ) THEN
          STOP 'Checkpoint completed -- killed by signal handler'
        ENDIF
      ENDIF
      CALL AUTODIFF_INADMODE_SET( myThid )
      IF ( debugLevel .GE. debLevB )
     &    CALL DEBUG_LEAVE('FORWARD_STEP',myThid)
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE FREESURF_RESCALE_G(
     I                     bi, bj, k,
     U                     gTracer,
     I                     myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8  gTracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE FREEZE( bi, bj, iMin, iMax, jMin, jMax,
     I                     K,
     I                     myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER bi,bj,iMin,iMax,jMin,jMax
      INTEGER K
      INTEGER myThid
      INTEGER i,j
      Real*8 Tfreezing
      Tfreezing=-1.9d0
       DO j=jMin,jMax
        DO i=iMin,iMax
         IF (gT(i,j,k,bi,bj) .LT. Tfreezing) THEN
          gT(i,j,k,bi,bj)=Tfreezing
         ENDIF
        ENDDO
       ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE FREEZE_SURFACE( myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      INTEGER bi,bj,i,j,k
      Real*8 Tfreezing
      IF ( usingPCoords ) THEN
        k = Nr
      ELSE
        k = 1
      ENDIF
      Tfreezing = -1.9d0
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
        DO j=1-OLy,sNy+OLy
         DO i=1-OLx,sNx+OLx
          IF (theta(i,j,k,bi,bj) .LT. Tfreezing) THEN
             surfaceForcingTice(i,j,bi,bj) =
     &            ( Tfreezing - theta(i,j,k,bi,bj) )
     &                    *drF(k)*hFacC(i,j,k,bi,bj) / dTtracerLev(k)
             theta(i,j,k,bi,bj) = Tfreezing
          ELSE
             surfaceForcingTice(i,j,bi,bj) = 0.d0
          ENDIF
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE GRAD_SIGMA(
     I             bi, bj, iMin, iMax, jMin, jMax, K,
     I             rhoK, sigKm1, sigKp1,
     O             sigmaX, sigmaY, sigmaR,
     I             myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER bi,bj,iMin,iMax,jMin,jMax,K
      Real*8 rhoK(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 sigKm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 sigKp1(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 sigmaX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 sigmaY(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 sigmaR(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      INTEGER myThid
      INTEGER i,j
      Real*8 rhoLoc(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx,sNx+Olx
        rhoLoc(i,j) = rhoK(i,j)
       ENDDO
      ENDDO
      IF ( useCubedSphereExchange ) THEN
        CALL FILL_CS_CORNER_TR_RL( 1, .FALSE.,
     &                             rhoLoc, bi,bj, myThid )
      ENDIF
      DO j=1-Oly,sNy+Oly
       DO i=1-Olx+1,sNx+Olx
        sigmaX(i,j,k)=maskW(i,j,k,bi,bj)
     &        *recip_dxC(i,j,bi,bj)
     &        *(rhoLoc(i,j)-rhoLoc(i-1,j))
       ENDDO
      ENDDO
      IF ( useCubedSphereExchange ) THEN
        CALL FILL_CS_CORNER_TR_RL( 2, .FALSE.,
     &                             rhoLoc, bi,bj, myThid )
      ENDIF
      DO j=1-Oly+1,sNy+Oly
       DO i=1-Olx,sNx+Olx
        sigmaY(i,j,k)=maskS(i,j,k,bi,bj)
     &        *recip_dyC(i,j,bi,bj)
     &        *(rhoLoc(i,j)-rhoLoc(i,j-1))
       ENDDO
      ENDDO
      IF (K.EQ.1) THEN
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         sigmaR(i,j,k)=0.
        ENDDO
       ENDDO
      ELSE
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         sigmaR(i,j,k)= maskC(i,j,k,bi,bj)
     &                *recip_drC(k)*rkSign
     &                *(sigKp1(i,j)-sigKm1(i,j))
        ENDDO
       ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE IMPLDIFF( bi, bj, iMin, iMax, jMin, jMax,
     I                     tracerId, KappaRX, recip_hFac,
     U                     gXNm1,
     I                     myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      INTEGER bi,bj,iMin,iMax,jMin,jMax
      INTEGER tracerId
      Real*8 KappaRX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 recip_hFac(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      Real*8 gXnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      INTEGER myThid
      INTEGER i,j,k
      Real*8 deltaTX(Nr)
      Real*8 gYnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      Real*8 a(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 b(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 c(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 bet(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 gam(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      IF ( tracerId.GE.1 ) THEN
        DO k=1,Nr
         deltaTX(k) = dTtracerLev(k)
        ENDDO
      ELSE
        DO k=1,Nr
         deltaTX(k) = deltaTmom
        ENDDO
      ENDIF
      DO k=1,Nr
       DO j=jMin,jMax
        DO i=iMin,iMax
         gYNm1(i,j,k,bi,bj) = 0.d0
        ENDDO
       ENDDO
      ENDDO
      DO j=jMin,jMax
       DO i=iMin,iMax
         a(i,j,1) = 0.d0 
       ENDDO
      ENDDO
      DO k=2,Nr
       DO j=jMin,jMax
        DO i=iMin,iMax
          a(i,j,k) = -deltaTX(k)*recip_hFac(i,j,k,bi,bj)*recip_drF(k)
     &               *recip_deepFac2C(k)*recip_rhoFacC(k)
     &               *KappaRX(i,j, k )*recip_drC( k )
     &               *deepFac2F(k)*rhoFacF(k)
          IF (recip_hFac(i,j,k-1,bi,bj).EQ.0.) a(i,j,k)=0.
        ENDDO
       ENDDO
      ENDDO
      DO k=1,Nr-1
       DO j=jMin,jMax
        DO i=iMin,iMax
          c(i,j,k) = -deltaTX(k)*recip_hFac(i,j,k,bi,bj)*recip_drF(k)
     &               *recip_deepFac2C(k)*recip_rhoFacC(k)
     &               *KappaRX(i,j,k+1)*recip_drC(k+1)
     &               *deepFac2F(k+1)*rhoFacF(k+1)
          IF (recip_hFac(i,j,k+1,bi,bj).EQ.0.) c(i,j,k)=0.
        ENDDO
       ENDDO
      ENDDO
      DO j=jMin,jMax
       DO i=iMin,iMax
         c(i,j,Nr) = 0.d0
       ENDDO
      ENDDO
      DO k=1,Nr
       DO j=jMin,jMax
        DO i=iMin,iMax
          b(i,j,k) = 1.d0 - c(i,j,k) - a(i,j,k)
        ENDDO
       ENDDO
      ENDDO
      DO k=1,Nr
       DO j=jMin,jMax
        DO i=iMin,iMax
          bet(i,j,k) = 1.d0
          gam(i,j,k) = 0.d0
        ENDDO
       ENDDO
      ENDDO
      IF (Nr.GT.1) THEN
       k = 1
       DO j=jMin,jMax
        DO i=iMin,iMax
         IF (b(i,j,1).NE.0.) bet(i,j,1) = 1.d0 / b(i,j,1)
        ENDDO
       ENDDO
      ENDIF
      IF (Nr.GE.2) THEN
CADJ loop = sequential
       DO k=2,Nr
        DO j=jMin,jMax
         DO i=iMin,iMax
          gam(i,j,k) = c(i,j,k-1)*bet(i,j,k-1)
          IF ( ( b(i,j,k) - a(i,j,k)*gam(i,j,k) ) .NE. 0.) 
     &        bet(i,j,k) = 1.d0 / ( b(i,j,k) - a(i,j,k)*gam(i,j,k) )
         ENDDO
        ENDDO
       ENDDO
      ENDIF
      DO j=jMin,jMax
       DO i=iMin,iMax
        gYNm1(i,j,1,bi,bj) = gXNm1(i,j,1,bi,bj)*bet(i,j,1)
       ENDDO
      ENDDO
      DO k=2,Nr
       DO j=jMin,jMax
        DO i=iMin,iMax
         gYnm1(i,j,k,bi,bj) = bet(i,j,k)*
     &        (gXnm1(i,j,k,bi,bj) - a(i,j,k)*gYnm1(i,j,k-1,bi,bj))
        ENDDO
       ENDDO
      ENDDO
CADJ loop = sequential
       DO k=Nr-1,1,-1
        DO j=jMin,jMax
         DO i=iMin,iMax
          gYnm1(i,j,k,bi,bj)=gYnm1(i,j,k,bi,bj)
     &              -gam(i,j,k+1)*gYnm1(i,j,k+1,bi,bj)
         ENDDO
        ENDDO
       ENDDO
       DO k=1,Nr
        DO j=jMin,jMax
         DO i=iMin,iMax
          gXnm1(i,j,k,bi,bj)=gYnm1(i,j,k,bi,bj)
         ENDDO
        ENDDO
       ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_AUTODIFF( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      INTEGER bi, bj
      INTEGER  I, J, K
      TsurfCor=0.d0
      SsurfCor=0.d0
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO K=1,Nr
         DO J=1-Oly,sNy+Oly
          DO I=1-Olx,sNx+Olx
          ENDDO
         ENDDO
        ENDDO
        DO J=1-Oly,sNy+Oly
         DO I=1-Olx,sNx+Olx
         dEtaHdt(i,j,bi,bj) = 0.d0
         PmEpR(i,j,bi,bj) = 0.d0
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_CARTESIAN_GRID( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      INTEGER iG, jG, bi, bj, i, j
      Real*8 xG0, yG0
      Real*8 xGloc(1-Olx:sNx+Olx+1,1-Oly:sNy+Oly+1)
      Real*8 yGloc(1-Olx:sNx+Olx+1,1-Oly:sNy+Oly+1)
      INTEGER iGl,jGl
      iGl(i,bi) = 1+MOD(myXGlobalLo-1+(bi-1)*sNx+i+Olx*Nx-1,Nx)
      jGl(j,bj) = 1+MOD(myYGlobalLo-1+(bj-1)*sNy+j+Oly*Ny-1,Ny)
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        jG = myYGlobalLo + (bj-1)*sNy
        iG = myXGlobalLo + (bi-1)*sNx
cC- note: does not work for non-uniform delX or delY
        xG0 = xgOrigin
        DO i=1, iG-1
         xG0 = xG0 + delX(i)
        ENDDO
        DO i=1, Olx
         xG0 = xG0 - delX( 1+MOD(Olx*Nx-1+iG-i,Nx) )
        ENDDO
        yG0 = ygOrigin
        DO j=1, jG-1
         yG0 = yG0 + delY(j)
        ENDDO
        DO j=1, Oly
         yG0 = yG0 - delY( 1+MOD(Oly*Ny-1+jG-j,Ny) )
        ENDDO
        DO j=1-Oly,sNy+Oly +1
         xGloc(1-Olx,j) = xG0
         DO i=1-Olx,sNx+Olx
          xGloc(i+1,j) = xGloc(i,j) + delX( iGl(i,bi) )
         ENDDO
        ENDDO
        DO i=1-Olx,sNx+Olx +1
         yGloc(i,1-Oly) = yG0
         DO j=1-Oly,sNy+Oly
          yGloc(i,j+1) = yGloc(i,j) + delY( jGl(j,bj) )
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          xG(i,j,bi,bj) = xGloc(i,j)
          yG(i,j,bi,bj) = yGloc(i,j)
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          xC(i,j,bi,bj) = 0.25d0*(
     &     xGloc(i,j)+xGloc(i+1,j)+xGloc(i,j+1)+xGloc(i+1,j+1) )
          yC(i,j,bi,bj) = 0.25d0*(
     &     yGloc(i,j)+yGloc(i+1,j)+yGloc(i,j+1)+yGloc(i+1,j+1) )
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          dxF(i,j,bi,bj) = delX( iGl(i,bi) )
          dyF(i,j,bi,bj) = delY( jGl(j,bj) )
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          dxG(i,j,bi,bj) = delX( iGl(i,bi) )
          dyG(i,j,bi,bj) = delY( jGl(j,bj) )
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          dxC(i,j,bi,bj) = 0.
          dyC(i,j,bi,bj) = 0.
          dxV(i,j,bi,bj) = 0.
          dyU(i,j,bi,bj) = 0.
          rAw(i,j,bi,bj) = 0.
          rAs(i,j,bi,bj) = 0.
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx+1,sNx+Olx ! NOTE range
          dxC(i,j,bi,bj) = 0.5d0*(dxF(i,j,bi,bj)+dxF(i-1,j,bi,bj))
         ENDDO
        ENDDO
        DO j=1-Oly+1,sNy+Oly ! NOTE range
         DO i=1-Olx,sNx+Olx
          dyC(i,j,bi,bj) = 0.5d0*(dyF(i,j,bi,bj)+dyF(i,j-1,bi,bj))
         ENDDO
        ENDDO
        DO j=1-Oly+1,sNy+Oly ! NOTE range
         DO i=1-Olx+1,sNx+Olx ! NOTE range
          dxV(i,j,bi,bj) = 0.5d0*(dxG(i,j,bi,bj)+dxG(i-1,j,bi,bj))
          dyU(i,j,bi,bj) = 0.5d0*(dyG(i,j,bi,bj)+dyG(i,j-1,bi,bj))
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          rA (i,j,bi,bj) = dxF(i,j,bi,bj)*dyF(i,j,bi,bj)
          rAw(i,j,bi,bj) = dxC(i,j,bi,bj)*dyG(i,j,bi,bj)
          rAs(i,j,bi,bj) = dxG(i,j,bi,bj)*dyC(i,j,bi,bj)
          rAz(i,j,bi,bj) = dxV(i,j,bi,bj)*dyU(i,j,bi,bj)
          tanPhiAtU(i,j,bi,bj) = 0.
          tanPhiAtV(i,j,bi,bj) = 0.
          angleCosC(i,j,bi,bj) = 1.
          angleSinC(i,j,bi,bj) = 0.
         ENDDO
        ENDDO
        DO j=1-OLy,sNy+OLy
         cosFacU(j,bi,bj)=1.
         cosFacV(j,bi,bj)=1.
         sqcosFacU(j,bi,bj)=1.
         sqcosFacV(j,bi,bj)=1.
        ENDDO
       ENDDO
      ENDDO
      IF ( myThid .EQ. 1 ) THEN
      IF ( latBandClimRelax.EQ.UNSET_RL ) THEN
        latBandClimRelax = 0.
        DO j=1,Ny
          latBandClimRelax = latBandClimRelax + delY(j)
        ENDDO
        latBandClimRelax = latBandClimRelax*3.d0
      ENDIF
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_CG2D( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /CG2D_I_L/ cg2dNormaliseRHS
      LOGICAL cg2dNormaliseRHS
      COMMON /CG2D_I_R/
     &      aW2d, aS2d, aC2d,
     &      pW, pS, pC,
     &      cg2dNorm, cg2dTolerance
      Real*8  aW2d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  aS2d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  aC2d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pW   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pC   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  cg2dNorm, cg2dTolerance
      COMMON /CG2D_I_WK_R/
     & cg2d_q, cg2d_r, cg2d_s
      Real*8  cg2d_q(1-1:sNx+1,1-1:sNy+1,nSx,nSy)
      Real*8  cg2d_r(1-1:sNx+1,1-1:sNy+1,nSx,nSy)
      Real*8  cg2d_s(1-1:sNx+1,1-1:sNy+1,nSx,nSy)
      INTEGER myThid
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      INTEGER bi, bj
      INTEGER i, j, k, ks
      Real*8     faceArea
      Real*8     myNorm
      Real*8     aC, aCw, aCs
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
        DO j=1-OLy,sNy+OLy
         DO i=1-OLx,sNx+OLx
          aW2d(i,j,bi,bj) = 0.d0
          aS2d(i,j,bi,bj) = 0.d0
          aC2d(i,j,bi,bj) = 0.d0
          pW(i,j,bi,bj) = 0.d0
          pS(i,j,bi,bj) = 0.d0
          pC(i,j,bi,bj) = 0.d0
         ENDDO
        ENDDO
        DO j=1-1,sNy+1
         DO i=1-1,sNx+1
          cg2d_q(i,j,bi,bj) = 0.d0
          cg2d_r(i,j,bi,bj) = 0.d0
          cg2d_s(i,j,bi,bj) = 0.d0
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      myNorm = 0.d0
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
        DO j=1,sNy
         DO i=1,sNx
          aW2d(i,j,bi,bj) = 0.d0
          aS2d(i,j,bi,bj) = 0.d0
         ENDDO
        ENDDO
        DO k=1,Nr
         DO j=1,sNy
          DO i=1,sNx
           faceArea = dyG(i,j,bi,bj)*drF(k)
     &               *hFacW(i,j,k,bi,bj)
           aW2d(i,j,bi,bj) = aW2d(i,j,bi,bj)
     &              + implicSurfPress*implicDiv2DFlow
     &               *faceArea*recip_dxC(i,j,bi,bj)
           faceArea = dxG(i,j,bi,bj)*drF(k)
     &               *hFacS(i,j,k,bi,bj)
           aS2d(i,j,bi,bj) = aS2d(i,j,bi,bj)
     &              + implicSurfPress*implicDiv2DFlow
     &               *faceArea*recip_dyC(i,j,bi,bj)
          ENDDO
         ENDDO
        ENDDO
        DO j=1,sNy
         DO i=1,sNx
          myNorm = MAX(ABS(aW2d(i,j,bi,bj)),myNorm)
          myNorm = MAX(ABS(aS2d(i,j,bi,bj)),myNorm)
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      CALL GLOBAL_MAX_R8 (  myNorm,  myThid  )
      IF ( myNorm .NE. 0.d0 ) THEN
       myNorm = 1.d0/myNorm
      ELSE
       myNorm = 1.d0
      ENDIF
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
        DO j=1,sNy
         DO i=1,sNx
          aW2d(i,j,bi,bj) = aW2d(i,j,bi,bj)*myNorm
          aS2d(i,j,bi,bj) = aS2d(i,j,bi,bj)*myNorm
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      CALL EXCH_UV_XY_RS( aW2d, aS2d, .FALSE., myThid )
      IF ( myThid .EQ. 1 ) THEN
      cg2dNorm = myNorm
      cg2dNormaliseRHS = cg2dTargetResWunit.LE.0.
      IF (cg2dNormaliseRHS) THEN
        cg2dTolerance = cg2dTargetResidual
      ELSE
        cg2dTolerance = cg2dNorm * cg2dTargetResWunit
     &                           * globalArea / deltaTmom
      ENDIF
      ENDIF
      IF (  myThid  .EQ. 1 ) THEN
       WRITE(msgBuf,'(2A,1PE23.16)') 'INI_CG2D: ',
     &      'CG2D normalisation factor = ', cg2dNorm
       CALL PRINT_MESSAGE( msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
       IF (.NOT.cg2dNormaliseRHS) THEN
        WRITE(msgBuf,'(2A,1PE22.15,A,1PE16.10,A)') 'INI_CG2D: ',
     &      'cg2dTolerance =', cg2dTolerance, ' (Area=',globalArea,')'
        CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
       ENDIF
       WRITE(msgBuf,*) ' '
       CALL PRINT_MESSAGE( msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
      ENDIF
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
        DO j=0,sNy+1
         DO i=0,sNx+1
           ks = ksurfC(i,j,bi,bj)
           aC2d(i,j,bi,bj) = -(
     &       aW2d(i,j,bi,bj) + aW2d(i+1,j, bi,bj)
     &      +aS2d(i,j,bi,bj) + aS2d( i,j+1,bi,bj)
     &      +freeSurfFac*myNorm*recip_Bo(i,j,bi,bj)*deepFac2F(ks)
     &                  *rA(i,j,bi,bj)/deltaTMom/deltaTfreesurf
     &                        )
         ENDDO
        ENDDO
        DO j=1,sNy
         DO i=1,sNx
           aC  = aC2d( i, j, bi,bj)
           aCs = aC2d( i,j-1,bi,bj)
           aCw = aC2d(i-1,j, bi,bj)
           IF ( aC .EQ. 0. ) THEN
            pC(i,j,bi,bj) = 1.d0
           ELSE
            pC(i,j,bi,bj) =  1.d0 / aC
           ENDIF
           IF ( aC + aCw .EQ. 0. ) THEN
            pW(i,j,bi,bj) = 0.
           ELSE
            pW(i,j,bi,bj) =
     &         -aW2d(i,j,bi,bj)/((cg2dpcOffDFac *(aCw+aC))**2 )
           ENDIF
           IF ( aC + aCs .EQ. 0. ) THEN
            pS(i,j,bi,bj) = 0.
           ELSE
            pS(i,j,bi,bj) =
     &         -aS2d(i,j,bi,bj)/((cg2dpcOffDFac *(aCs+aC))**2 )
           ENDIF
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      CALL EXCH_XY_RS( pC, myThid )
      CALL EXCH_UV_XY_RS( pW, pS, .FALSE., myThid )
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_CORI( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
C
      CHARACTER*(*) mon_head
      PARAMETER (   mon_head         = '%MON'     )
      CHARACTER*(*) mon_foot_min
      PARAMETER (   mon_foot_min     = '_min'     )
      CHARACTER*(*) mon_foot_max
      PARAMETER (   mon_foot_max     = '_max'     )
      CHARACTER*(*) mon_foot_sd
      PARAMETER (   mon_foot_sd      = '_sd'      )
      CHARACTER*(*) mon_foot_mean
      PARAMETER (   mon_foot_mean    = '_mean'    )
      CHARACTER*(*) mon_foot_volint
      PARAMETER (   mon_foot_volint  = '_volint'  )
      CHARACTER*(*) mon_foot_volmean
      PARAMETER (   mon_foot_volmean = '_volmean' )
      CHARACTER*(*) mon_foot_del2
      PARAMETER (   mon_foot_del2    = '_del2'    )
      CHARACTER*(*) mon_foot_vol
      PARAMETER (   mon_foot_vol     = '_vol'     )
      CHARACTER*(*) mon_string_none
      PARAMETER (   mon_string_none  = 'NONE'     )
      COMMON /MON_I/ mon_ioUnit, mon_prefL
      INTEGER mon_ioUnit
      INTEGER mon_prefL
      COMMON /MON_C/ mon_pref
      CHARACTER*(MAX_LEN_MBUF) mon_pref
      COMMON /MON_R/ monSolutionMaxRange
      Real*8  monSolutionMaxRange
      COMMON /MON_L/
     &               mon_write_stdout, mon_write_mnc
      LOGICAL mon_write_stdout, mon_write_mnc
      COMMON /MON_F/
     &     mon_fname
      CHARACTER*(MAX_LEN_FNAM) mon_fname
      INTEGER myThid
      LOGICAL  MASTER_CPU_IO
      EXTERNAL MASTER_CPU_IO
      INTEGER bi,bj
      INTEGER i, j
      Real*8 facGrid
      INTEGER myTile, iG, iLen
      CHARACTER*(MAX_LEN_FNAM) fName
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      INTEGER  ILNBLNK
      EXTERNAL ILNBLNK
      IF     ( useConstantF ) THEN
        DO bj = myByLo(myThid), myByHi(myThid)
          DO bi = myBxLo(myThid), myBxHi(myThid)
            DO j=1-Oly,sNy+Oly
              DO i=1-Olx,sNx+Olx
                fCori(i,j,bi,bj)  = f0
                fCoriG(i,j,bi,bj) = f0
                fCoriCos(i,j,bi,bj)=0.d0
              ENDDO
            ENDDO
          ENDDO
        ENDDO
      ELSEIF ( useBetaPlaneF ) THEN
        facGrid = 1.d0
        IF ( usingSphericalPolarGrid
     &     .OR. usingCurvilinearGrid ) facGrid = deg2rad*rSphere
        DO bj = myByLo(myThid), myByHi(myThid)
          DO bi = myBxLo(myThid), myBxHi(myThid)
            DO j=1-Oly,sNy+Oly
              DO i=1-Olx,sNx+Olx
                fCori(i,j,bi,bj)  = f0+beta*yC(i,j,bi,bj)*facGrid
                fCoriG(i,j,bi,bj) = f0+beta* yG(i,j,bi,bj)*facGrid
                fCoriCos(i,j,bi,bj)=0.d0
              ENDDO
            ENDDO
          ENDDO
        ENDDO
      ELSEIF ( useSphereF ) THEN
        DO bj = myByLo(myThid), myByHi(myThid)
          DO bi = myBxLo(myThid), myBxHi(myThid)
            DO j=1-Oly,sNy+Oly
              DO i=1-Olx,sNx+Olx
                fCori(i,j,bi,bj)  =
     &                 2.d0*omega*sin(yC(i,j,bi,bj)*deg2rad)
                fCoriG(i,j,bi,bj) =
     &                 2.d0*omega*sin(yG(i,j,bi,bj)*deg2rad)
                fCoriCos(i,j,bi,bj)=
     &                 2.d0*omega*cos(yC(i,j,bi,bj)*deg2rad)
              ENDDO
            ENDDO
          ENDDO
        ENDDO
      ELSE
        DO bj = myByLo(myThid), myByHi(myThid)
          DO bi = myBxLo(myThid), myBxHi(myThid)
            DO j=1-Oly,sNy+Oly
              DO i=1-Olx,sNx+Olx
                fCori(i,j,bi,bj)  = 0.d0
                fCoriG(i,j,bi,bj) = 0.d0
                fCoriCos(i,j,bi,bj)=0.d0
              ENDDO
            ENDDO
          ENDDO
        ENDDO
        CALL READ_REC_XY_RS( 'fCoriC.bin', fCori,   1, 0, myThid )
        CALL READ_REC_XY_RS( 'fCorCs.bin', fCoriCos,1, 0, myThid )
        IF ( .NOT.useCubedSphereExchange ) THEN
         CALL READ_REC_XY_RS('fCoriG.bin', fCoriG,  1, 0, myThid )
        ELSE
         IF ( myThid .EQ. 1 ) THEN
         DO bj = 1,nSy
          DO bi = 1,nSx
           iG = bi+(myXGlobalLo-1)/sNx
           myTile = iG
           WRITE(fName,'(2A,I3.3,A)') 'fCoriG','.face',iG,'.bin'
           iLen = ILNBLNK(fName)
           WRITE(msgBuf,'(A,I6,2A)')
     &       ' Reading tile:', myTile, ' from file ', fName(1:iLen)
           CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                         SQUEEZE_RIGHT , myThid )
           CALL MDS_FACEF_READ_RS( fName, readBinaryPrec, 1,
     &                             fCoriG, bi, bj, myThid )
          ENDDO
         ENDDO
         ENDIF
        ENDIF
        CALL EXCH_XY_RS( fCori, myThid )
        CALL EXCH_XY_RS( fCoriCos, myThid )
        CALL EXCH_Z_3D_RS( fCoriG, 1, myThid )
      ENDIF
      IF ( MASTER_CPU_IO(myThid) ) THEN
        IF (monitor_stdio) THEN
          mon_write_stdout = .TRUE.
        ELSE
          mon_write_stdout = .FALSE.
        ENDIF
        mon_write_mnc = .FALSE.
      ENDIF
      CALL MON_SET_PREF( mon_string_none, myThid )
      CALL MON_PRINTSTATS_RS(1,fCori,'fCori',myThid)
      CALL MON_PRINTSTATS_RS(1,fCoriG,'fCoriG',myThid)
      CALL MON_PRINTSTATS_RS(1,fCoriCos,'fCoriCos',myThid)
      IF ( MASTER_CPU_IO(myThid) ) THEN
        mon_write_stdout = .FALSE.
        mon_write_mnc    = .FALSE.
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_CURVILINEAR_GRID( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      LOGICAL anglesAreSet
      COMMON /LOCAL_INI_CURVILINEAR_GRID/ anglesAreSet
      INTEGER bi,bj
      INTEGER i,j
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      INTEGER fp
      INTEGER iG, jG, iL, iLen
      CHARACTER*(MAX_LEN_FNAM) fName
      CHARACTER*(MAX_LEN_MBUF) tmpBuf
      INTEGER  ILNBLNK
      EXTERNAL ILNBLNK
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          xC(i,j,bi,bj)=0.
          yC(i,j,bi,bj)=0.
          xG(i,j,bi,bj)=0.
          yG(i,j,bi,bj)=0.
          dxC(i,j,bi,bj)=0.
          dyC(i,j,bi,bj)=0.
          dxG(i,j,bi,bj)=0.
          dyG(i,j,bi,bj)=0.
          dxF(i,j,bi,bj)=0.
          dyF(i,j,bi,bj)=0.
          dxV(i,j,bi,bj)=0.
          dyU(i,j,bi,bj)=0.
          rA(i,j,bi,bj)=0.
          rAz(i,j,bi,bj)=0.
          rAw(i,j,bi,bj)=0.
          rAs(i,j,bi,bj)=0.
          tanPhiAtU(i,j,bi,bj)=0.
          tanPhiAtV(i,j,bi,bj)=0.
          angleCosC(i,j,bi,bj)=1.
          angleSinC(i,j,bi,bj)=0.
          cosFacU(j,bi,bj)=1.
          cosFacV(j,bi,bj)=1.
          sqCosFacU(j,bi,bj)=1.
          sqCosFacV(j,bi,bj)=1.
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      fp = precFloat64
      CALL BARRIER(myThid)
      IF ( myThid .EQ. 1 ) THEN
      DO bj = 1,nSy
       DO bi = 1,nSx
        iG = bi+(myXGlobalLo-1)/sNx
        jG = bj+(myYGlobalLo-1)/sNy
        WRITE(tmpBuf,'(2(A,I3))') 'tile:',iG,' ,',jG
        iG = iG + (jG-1)*(nSx*nPx)
        iLen = ILNBLNK(horizGridFile)
        IF ( iLen .EQ. 0 ) THEN
          WRITE(fName,'("tile",I3.3,".mitgrid")') iG
        ELSE
          WRITE(fName,'(2A,I3.3,A)') horizGridFile(1:iLen),
     &                              '.face',iG,'.bin'
        ENDIF
        iLen = ILNBLNK(fName)
        iL = ILNBLNK(tmpBuf)
        WRITE(msgBuf,'(3A)') tmpBuf(1:iL),
     &                   ' ; Read from file ',fName(1:iLen)
        CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                      SQUEEZE_RIGHT , myThid)
        WRITE(msgBuf,'(A)') '  =>'
        CALL MDS_FACEF_READ_RS( fName, fp, 1,  xC, bi, bj, myThid )
        iL = ILNBLNK(msgBuf)
        WRITE(tmpBuf,'(A,1X,A)') msgBuf(1:iL),'xC'
        CALL MDS_FACEF_READ_RS( fName, fp, 2,  yC, bi, bj, myThid )
        iL = ILNBLNK(tmpBuf)
        WRITE(msgBuf,'(A,1X,A)') tmpBuf(1:iL),'yC'
        CALL MDS_FACEF_READ_RS( fName, fp, 3, dxF, bi, bj, myThid )
        iL = ILNBLNK(msgBuf)
        WRITE(tmpBuf,'(A,1X,A)') msgBuf(1:iL),'dxF'
        CALL MDS_FACEF_READ_RS( fName, fp, 4, dyF, bi, bj, myThid )
        iL = ILNBLNK(tmpBuf)
        WRITE(msgBuf,'(A,1X,A)') tmpBuf(1:iL),'dyF'
        CALL MDS_FACEF_READ_RS( fName, fp, 5,  rA, bi, bj, myThid )
        iL = ILNBLNK(msgBuf)
        WRITE(tmpBuf,'(A,1X,A)') msgBuf(1:iL),'rA'
        CALL MDS_FACEF_READ_RS( fName, fp, 6,  xG, bi, bj, myThid )
        iL = ILNBLNK(tmpBuf)
        WRITE(msgBuf,'(A,1X,A)') tmpBuf(1:iL),'xG'
        CALL MDS_FACEF_READ_RS( fName, fp, 7,  yG, bi, bj, myThid )
        iL = ILNBLNK(msgBuf)
        WRITE(tmpBuf,'(A,1X,A)') msgBuf(1:iL),'yG'
        CALL MDS_FACEF_READ_RS( fName, fp, 8, dxV, bi, bj, myThid )
        iL = ILNBLNK(tmpBuf)
        WRITE(msgBuf,'(A,1X,A)') tmpBuf(1:iL),'dxV'
        CALL MDS_FACEF_READ_RS( fName, fp, 9, dyU, bi, bj, myThid )
        iL = ILNBLNK(msgBuf)
        WRITE(tmpBuf,'(A,1X,A)') msgBuf(1:iL),'dyU'
        CALL MDS_FACEF_READ_RS( fName, fp,10, rAz, bi, bj, myThid )
        iL = ILNBLNK(tmpBuf)
        WRITE(msgBuf,'(A,1X,A)') tmpBuf(1:iL),'rAz'
        CALL MDS_FACEF_READ_RS( fName, fp,11, dxC, bi, bj, myThid )
        iL = ILNBLNK(msgBuf)
        WRITE(tmpBuf,'(A,1X,A)') msgBuf(1:iL),'dxC'
        CALL MDS_FACEF_READ_RS( fName, fp,12, dyC, bi, bj, myThid )
        iL = ILNBLNK(tmpBuf)
        WRITE(msgBuf,'(A,1X,A)') tmpBuf(1:iL),'dyC'
        CALL MDS_FACEF_READ_RS( fName, fp,13, rAw, bi, bj, myThid )
        iL = ILNBLNK(msgBuf)
        WRITE(tmpBuf,'(A,1X,A)') msgBuf(1:iL),'rAw'
        CALL MDS_FACEF_READ_RS( fName, fp,14, rAs, bi, bj, myThid )
        iL = ILNBLNK(tmpBuf)
        WRITE(msgBuf,'(A,1X,A)') tmpBuf(1:iL),'rAs'
        CALL MDS_FACEF_READ_RS( fName, fp,15, dxG, bi, bj, myThid )
        iL = ILNBLNK(msgBuf)
        WRITE(tmpBuf,'(A,1X,A)') msgBuf(1:iL),'dxG'
        CALL MDS_FACEF_READ_RS( fName, fp,16, dyG, bi, bj, myThid )
        iL = ILNBLNK(tmpBuf)
        WRITE(msgBuf,'(A,1X,A)') tmpBuf(1:iL),'dyG'
        iLen = ILNBLNK(horizGridFile)
        IF ( iLen.GT.0 ) THEN
         CALL MDS_FACEF_READ_RS(fName,fp,17,angleCosC,bi,bj,myThid)
         iL = ILNBLNK(msgBuf)
         WRITE(tmpBuf,'(A,1X,A)') msgBuf(1:iL),'AngleCS'
         CALL MDS_FACEF_READ_RS(fName,fp,18,angleSinC,bi,bj,myThid)
         iL = ILNBLNK(tmpBuf)
         WRITE(msgBuf,'(A,1X,A)') tmpBuf(1:iL),'AngleSN'
         anglesAreSet = .TRUE.
        ELSE
         anglesAreSet = .FALSE.
        ENDIF
        CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                      SQUEEZE_RIGHT , myThid)
       ENDDO
      ENDDO
      ENDIF
      CALL EXCH_XY_RS(xC,myThid)
      CALL EXCH_XY_RS(yC,myThid)
      CALL EXCH_UV_AGRID_3D_RS( dxF, dyF, .FALSE., 1, myThid )
      CALL EXCH_XY_RS(rA,myThid )
      CALL EXCH_Z_3D_RS( xG, 1, myThid )
      CALL EXCH_Z_3D_RS( yG, 1, myThid )
      CALL EXCH_UV_BGRID_3D_RS( dxV, dyU, .FALSE., 1, myThid)
      CALL EXCH_Z_3D_RS( rAz, 1, myThid )
      CALL EXCH_UV_XY_RS(dxC,dyC,.FALSE.,myThid)
      CALL EXCH_UV_XY_RS(rAw,rAs,.FALSE.,myThid)
      CALL EXCH_UV_XY_RS(dyG,dxG,.FALSE.,myThid)
      IF ( .NOT.anglesAreSet ) THEN
       CALL CALC_ANGLES( myThid )
       CALL BARRIER(myThid)
       IF ( myThid .EQ. 1 ) THEN
       anglesAreSet = .TRUE.
       ENDIF
      ENDIF
      CALL EXCH_UV_AGRID_3D_RS(angleSinC,angleCosC,.TRUE., 1, myThid)
      IF ( myThid .EQ. 1 ) THEN
      IF ( .NOT.anglesAreSet .AND. use3dCoriolis ) THEN
        WRITE(msgBuf,'(2A)')
     &   'INI_CURVILINEAR_GRID: Angle of CurvilinearGrid not set',
     &   ' but needed for 3-D Coriolis'
        CALL PRINT_ERROR( msgBuf, myThid )
        STOP 'ABNORMAL END: S/R INI_CURVILINEAR_GRID'
      ENDIF
      ENDIF
      IF ( debugLevel .GE. debLevB ) THEN
        CALL PLOT_FIELD_XYRS( xC      , 'Current xC      ', 0, myThid )
        CALL PLOT_FIELD_XYRS( yC      , 'Current yC      ', 0, myThid )
        CALL PLOT_FIELD_XYRS( dxF     , 'Current dxF     ', 0, myThid )
        CALL PLOT_FIELD_XYRS( dyF     , 'Current dyF     ', 0, myThid )
        CALL PLOT_FIELD_XYRS( rA      , 'Current rA      ', 0, myThid )
        CALL PLOT_FIELD_XYRS( xG      , 'Current xG      ', 0, myThid )
        CALL PLOT_FIELD_XYRS( yG      , 'Current yG      ', 0, myThid )
        CALL PLOT_FIELD_XYRS( dxV     , 'Current dxV     ', 0, myThid )
        CALL PLOT_FIELD_XYRS( dyU     , 'Current dyU     ', 0, myThid )
        CALL PLOT_FIELD_XYRS( rAz     , 'Current rAz     ', 0, myThid )
        CALL PLOT_FIELD_XYRS( dxC     , 'Current dxC     ', 0, myThid )
        CALL PLOT_FIELD_XYRS( dyC     , 'Current dyC     ', 0, myThid )
        CALL PLOT_FIELD_XYRS( rAw     , 'Current rAw     ', 0, myThid )
        CALL PLOT_FIELD_XYRS( rAs     , 'Current rAs     ', 0, myThid )
        CALL PLOT_FIELD_XYRS( dxG     , 'Current dxG     ', 0, myThid )
        CALL PLOT_FIELD_XYRS( dyG     , 'Current dyG     ', 0, myThid )
        CALL PLOT_FIELD_XYRS(angleCosC, 'Current AngleCS ', 0, myThid )
        CALL PLOT_FIELD_XYRS(angleSinC, 'Current AngleSN ', 0, myThid )
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_CYLINDER_GRID( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      INTEGER iG, jG
      INTEGER bi, bj
      INTEGER i, j
      Real*8 dtheta, thisRad, xG0, yG0
      Real*8 xGloc(1-Olx:sNx+Olx+1,1-Oly:sNy+Oly+1)
      Real*8 yGloc(1-Olx:sNx+Olx+1,1-Oly:sNy+Oly+1)
      INTEGER iGl,jGl
      iGl(i,bi) = 1+MOD(myXGlobalLo-1+(bi-1)*sNx+i+Olx*Nx-1,Nx)
      jGl(j,bj) = 1+MOD(myYGlobalLo-1+(bj-1)*sNy+j+Oly*Ny-1,Ny)
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        jG = myYGlobalLo + (bj-1)*sNy
        iG = myXGlobalLo + (bi-1)*sNx
cC- note: does not work for non-uniform delX or delY
        xG0 = xgOrigin
        DO i=1, iG-1
         xG0 = xG0 + delX(i)
        ENDDO
        DO i=1, Olx
         xG0 = xG0 - delX( 1+mod(Olx*Nx-1+iG-i,Nx) )
        ENDDO
        yG0 = ygOrigin
        DO j=1, jG-1
         yG0 = yG0 + delY(j)
        ENDDO
        DO j=1, Oly
         yG0 = yG0 - delY( 1+mod(Oly*Ny-1+jG-j,Ny) )
        ENDDO
        DO j=1-Oly,sNy+Oly +1
         xGloc(1-Olx,j) = xG0
         DO i=1-Olx,sNx+Olx
          xGloc(i+1,j) = xGloc(i,j) + delX( iGl(i,bi) )
         ENDDO
        ENDDO
        DO i=1-Olx,sNx+Olx +1
         yGloc(i,1-Oly) = yG0
         DO j=1-Oly,sNy+Oly
          yGloc(i,j+1) = yGloc(i,j) + delY( jGl(j,bj) )
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          xG(i,j,bi,bj) = xGloc(i,j)
          yG(i,j,bi,bj) = yGloc(i,j)
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          xC(i,j,bi,bj) = 0.25d0*(
     &     xGloc(i,j)+xGloc(i+1,j)+xGloc(i,j+1)+xGloc(i+1,j+1) )
          yC(i,j,bi,bj) = 0.25d0*(
     &     yGloc(i,j)+yGloc(i+1,j)+yGloc(i,j+1)+yGloc(i+1,j+1) )
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          thisRad = yC(i,j,bi,bj)
          dtheta = delX( iGl(i,bi) )
          dxF(i,j,bi,bj) = thisRad*dtheta*deg2rad
          dyF(i,j,bi,bj) = delY( jGl(j,bj) )
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          thisRad = 0.5d0*(yGloc(i,j)+yGloc(i+1,j))
          dtheta = delX( iGl(i,bi) )
          dxG(i,j,bi,bj) = thisRad*dtheta*deg2rad
          dyG(i,j,bi,bj) = delY( jGl(j,bj) )
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          dxC(i,j,bi,bj) = 0.
          dyC(i,j,bi,bj) = 0.
          dxV(i,j,bi,bj) = 0.
          dyU(i,j,bi,bj) = 0.
          rAw(i,j,bi,bj) = 0.
          rAs(i,j,bi,bj) = 0.
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx+1,sNx+Olx ! NOTE range
          dxC(i,j,bi,bj) = 0.5d0*(dxF(i,j,bi,bj)+dxF(i-1,j,bi,bj))
         ENDDO
        ENDDO
        DO j=1-Oly+1,sNy+Oly ! NOTE range
         DO i=1-Olx,sNx+Olx
          dyC(i,j,bi,bj) = 0.5d0*(dyF(i,j,bi,bj)+dyF(i,j-1,bi,bj))
         ENDDO
        ENDDO
        DO j=1-Oly+1,sNy+Oly ! NOTE range
         DO i=1-Olx+1,sNx+Olx ! NOTE range
          dxV(i,j,bi,bj) = 0.5d0*(dxG(i,j,bi,bj)+dxG(i-1,j,bi,bj))
          dyU(i,j,bi,bj) = 0.5d0*(dyG(i,j,bi,bj)+dyG(i,j-1,bi,bj))
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          rA (i,j,bi,bj) = dxF(i,j,bi,bj)*dyF(i,j,bi,bj)
          rAw(i,j,bi,bj) = dxC(i,j,bi,bj)*dyG(i,j,bi,bj)
          rAs(i,j,bi,bj) = dxG(i,j,bi,bj)*dyC(i,j,bi,bj)
          rAz(i,j,bi,bj) = dxV(i,j,bi,bj)*dyU(i,j,bi,bj)
          tanPhiAtU(i,j,bi,bj) = 0.
          tanPhiAtV(i,j,bi,bj) = 0.
          angleCosC(i,j,bi,bj) = 1.
          angleSinC(i,j,bi,bj) = 0.
         ENDDO
        ENDDO
        DO j=1-OLy,sNy+OLy
         cosFacU(j,bi,bj)=1.
         cosFacV(j,bi,bj)=1.
         sqcosFacU(j,bi,bj)=1.
         sqcosFacV(j,bi,bj)=1.
        ENDDO
       ENDDO ! bi
      ENDDO ! bj
      IF ( latBandClimRelax.EQ.UNSET_RL ) THEN
        IF ( myThid .EQ. 1 ) THEN
        latBandClimRelax = 0.
        DO j=1,Ny
          latBandClimRelax = latBandClimRelax + delY(j)
        ENDDO
        latBandClimRelax = latBandClimRelax*3.d0
        ENDIF
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_DEPTHS( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      INTEGER iG, jG
      INTEGER bi, bj
      INTEGER  i, j
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      IF (usingPCoords .AND. bathyFile .NE. ' '
     &                 .AND. topoFile  .NE. ' ' ) THEN
       WRITE(msgBuf,'(A,A)')
     &  'S/R INI_DEPTHS: both bathyFile & topoFile are specified:',
     &  ' select the right one !'
       CALL PRINT_ERROR( msgBuf , myThid)
       STOP 'ABNORMAL END: S/R INI_DEPTHS'
      ENDIF
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          R_low(i,j,bi,bj)   = 0.d0
          Ro_surf(i,j,bi,bj) = 0.d0
          topoZ(i,j,bi,bj)   = 0.d0
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      IF (usingPCoords .OR. bathyFile .EQ. ' ') THEN
       DO bj = myByLo(myThid), myByHi(myThid)
        DO bi = myBxLo(myThid), myBxHi(myThid)
         DO j=1,sNy
          DO i=1,sNx
           R_low(i,j,bi,bj) = rF(Nr+1)
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ELSE
          CALL READ_REC_XY_RS( bathyFile, R_low, 1, 0, myThid )
      ENDIF
      CALL EXCH_XY_RS ( R_low,  myThid  )
      IF ( debugLevel.GE.debLevB ) THEN
       CALL PLOT_FIELD_XYRS( R_low, 'Bottom depths (ini_depths)',
     &                       -1, myThid )
      ENDIF
      IF ( usingPCoords .AND. bathyFile.NE.' ' ) THEN
        CALL READ_REC_XY_RS( bathyFile, Ro_surf, 1, 0, myThid )
      ELSEIF ( topoFile.EQ.' ' ) THEN
        DO bj = myByLo(myThid), myByHi(myThid)
         DO bi = myBxLo(myThid), myBxHi(myThid)
          DO j=1,sNy
           DO i=1,sNx
            Ro_surf(i,j,bi,bj) = rF(1)
           ENDDO
          ENDDO
         ENDDO
        ENDDO
      ELSE
        CALL READ_REC_XY_RS( topoFile, topoZ, 1, 0, myThid )
        IF (buoyancyRelation .EQ. 'ATMOSPHERIC') THEN
          CALL INI_P_GROUND( 2, topoZ,
     O                       Ro_surf,
     I                       myThid )
        ELSEIF ( buoyancyRelation.EQ.'OCEANICP' ) THEN
          WRITE(msgBuf,'(A,A)') 'S/R INI_DEPTHS: ',
     &     'from topoFile (in m) to ref.bottom pressure: Not yet coded'
          CALL PRINT_ERROR( msgBuf , myThid)
          STOP 'ABNORMAL END: S/R INI_DEPTHS'
        ELSE
          DO bj = myByLo(myThid), myByHi(myThid)
           DO bi = myBxLo(myThid), myBxHi(myThid)
            DO j=1,sNy
             DO i=1,sNx
              Ro_surf(i,j,bi,bj) = topoZ(i,j,bi,bj)
             ENDDO
            ENDDO
           ENDDO
          ENDDO
        ENDIF
      ENDIF
      CALL EXCH_XY_RS ( Ro_surf,  myThid  )
      IF (usingPCoords) THEN
       DO bj = myByLo(myThid), myByHi(myThid)
        DO bi = myBxLo(myThid), myBxHi(myThid)
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           iG = myXGlobalLo-1+(bi-1)*sNx+i
           jG = myYGlobalLo-1+(bj-1)*sNy+j
           IF ( usingSphericalPolarGrid .AND.
     &          ABS(yC(i,j,bi,bj)).GE.90. )
     &       Ro_surf(i,j,bi,bj) = rF(Nr+1)
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ELSE
       DO bj = myByLo(myThid), myByHi(myThid)
        DO bi = myBxLo(myThid), myBxHi(myThid)
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           iG = myXGlobalLo-1+(bi-1)*sNx+i
           jG = myYGlobalLo-1+(bj-1)*sNy+j
           IF ( usingSphericalPolarGrid .AND.
     &          ABS(yC(i,j,bi,bj)).GE.90. )
     &       R_low(i,j,bi,bj) = rF(1)
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDIF
      IF ( debugLevel.GE.debLevB ) THEN
       CALL BARRIER(myThid)
       CALL PLOT_FIELD_XYRS( Ro_surf,
     &           'Surface reference r-position (ini_depths)',
     &           -1, myThid )
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_FIELDS( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER myThid
      IF ( startTime .EQ. baseTime .AND.  nIter0 .EQ. 0
     &     .AND. pickupSuff .EQ. ' ' ) THEN
        CALL INI_VEL( myThid )
        CALL INI_THETA( myThid )
        CALL INI_SALT( myThid )
        CALL INI_PSURF( myThid )
        CALL INI_PRESSURE( myThid )
      ELSEIF ( .NOT.useOffLine ) THEN
        CALL READ_PICKUP( nIter0, myThid )
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_FORCING( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      INTEGER bi, bj
      INTEGER  i, j
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO j=1-OLy,sNy+OLy
         DO i=1-OLx,sNx+OLx
          fu              (i,j,bi,bj) = 0.d0
          fv              (i,j,bi,bj) = 0.d0
          Qnet            (i,j,bi,bj) = 0.d0
          EmPmR           (i,j,bi,bj) = 0.d0
          saltFlux        (i,j,bi,bj) = 0.d0
          SST             (i,j,bi,bj) = 0.d0
          SSS             (i,j,bi,bj) = 0.d0
          Qsw             (i,j,bi,bj) = 0.d0
          pLoad           (i,j,bi,bj) = 0.d0
          sIceLoad        (i,j,bi,bj) = 0.d0
          surfaceForcingU(i,j,bi,bj) = 0.d0
          surfaceForcingV(i,j,bi,bj) = 0.d0
          surfaceForcingT(i,j,bi,bj) = 0.d0
          surfaceForcingS(i,j,bi,bj) = 0.d0
          surfaceForcingTice(i,j,bi,bj) = 0.d0
          taux0           (i,j,bi,bj) = 0.d0
          taux1           (i,j,bi,bj) = 0.d0
          tauy0           (i,j,bi,bj) = 0.d0
          tauy1           (i,j,bi,bj) = 0.d0
          Qnet0           (i,j,bi,bj) = 0.d0
          Qnet1           (i,j,bi,bj) = 0.d0
          EmPmR0          (i,j,bi,bj) = 0.d0
          EmPmR1          (i,j,bi,bj) = 0.d0
          saltFlux0       (i,j,bi,bj) = 0.d0
          saltFlux1       (i,j,bi,bj) = 0.d0
          SST0            (i,j,bi,bj) = 0.d0
          SST1            (i,j,bi,bj) = 0.d0
          SSS0            (i,j,bi,bj) = 0.d0
          SSS1            (i,j,bi,bj) = 0.d0
          Qnetm (i,j,bi,bj) = 0.d0
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          IF ( doThetaClimRelax .AND.
     &         ABS(yC(i,j,bi,bj)).LE.latBandClimRelax ) THEN
           lambdaThetaClimRelax(i,j,bi,bj) = 1.d0/tauThetaClimRelax
          ELSE
           lambdaThetaClimRelax(i,j,bi,bj) = 0.d0
          ENDIF
          IF ( doSaltClimRelax .AND.
     &         ABS(yC(i,j,bi,bj)).LE.latBandClimRelax ) THEN
           lambdaSaltClimRelax(i,j,bi,bj) = 1.d0/tauSaltClimRelax
          ELSE
           lambdaSaltClimRelax(i,j,bi,bj) = 0.d0
          ENDIF
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      CALL BARRIER(myThid)
      IF ( zonalWindFile .NE. ' '  ) THEN
       CALL READ_FLD_XY_RS( zonalWindFile, ' ', fu, 0, myThid )
      ENDIF
      IF ( meridWindFile .NE. ' '  ) THEN
       CALL READ_FLD_XY_RS( meridWindFile, ' ', fv, 0, myThid )
      ENDIF
      IF ( surfQFile .NE. ' '  ) THEN
       CALL READ_FLD_XY_RS( surfQFile, ' ', Qnet, 0, myThid )
      ELSEIF ( surfQnetFile .NE. ' '  ) THEN
       CALL READ_FLD_XY_RS( surfQnetFile, ' ', Qnet, 0, myThid )
      ENDIF
      IF ( EmPmRfile .NE. ' '  ) THEN
       CALL READ_FLD_XY_RS( EmPmRfile, ' ', EmPmR, 0, myThid )
        CALL BARRIER(myThid)
        DO bj = myByLo(myThid), myByHi(myThid)
         DO bi = myBxLo(myThid), myBxHi(myThid)
          DO j=1-Oly,sNy+Oly
           DO i=1-Olx,sNx+Olx
            EmPmR(i,j,bi,bj) = EmPmR(i,j,bi,bj)*rhoConstFresh
           ENDDO
          ENDDO
         ENDDO
        ENDDO
      ENDIF
      IF ( saltFluxFile .NE. ' '  ) THEN
       CALL READ_FLD_XY_RS( saltFluxFile, ' ', saltFlux, 0, myThid )
      ENDIF
      IF ( thetaClimFile .NE. ' '  ) THEN
       CALL READ_FLD_XY_RS( thetaClimFile, ' ', SST, 0, myThid )
      ENDIF
      IF ( saltClimFile .NE. ' '  ) THEN
       CALL READ_FLD_XY_RS( saltClimFile, ' ', SSS, 0, myThid )
      ENDIF
      IF ( lambdaThetaFile .NE. ' '  ) THEN
       CALL READ_FLD_XY_RS( lambdaThetaFile, ' ',
     &  lambdaThetaClimRelax, 0, myThid )
      ENDIF
      IF ( lambdaSaltFile .NE. ' '  ) THEN
       CALL READ_FLD_XY_RS( lambdaSaltFile, ' ',
     &  lambdaSaltClimRelax, 0, myThid )
      ENDIF
      CALL EXCH_UV_XY_RS( fu,fv, .TRUE., myThid )
      CALL EXCH_XY_RS( Qnet , myThid )
      CALL EXCH_XY_RS( EmPmR, myThid )
      CALL EXCH_XY_RS( saltFlux, myThid )
      CALL EXCH_XY_RS( SST  , myThid )
      CALL EXCH_XY_RS( SSS  , myThid )
      CALL EXCH_XY_RS( lambdaThetaClimRelax, myThid )
      CALL EXCH_XY_RS( lambdaSaltClimRelax , myThid )
      CALL EXCH_XY_RS( Qnetm, myThid )
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_GRID( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
C
      CHARACTER*(*) mon_head
      PARAMETER (   mon_head         = '%MON'     )
      CHARACTER*(*) mon_foot_min
      PARAMETER (   mon_foot_min     = '_min'     )
      CHARACTER*(*) mon_foot_max
      PARAMETER (   mon_foot_max     = '_max'     )
      CHARACTER*(*) mon_foot_sd
      PARAMETER (   mon_foot_sd      = '_sd'      )
      CHARACTER*(*) mon_foot_mean
      PARAMETER (   mon_foot_mean    = '_mean'    )
      CHARACTER*(*) mon_foot_volint
      PARAMETER (   mon_foot_volint  = '_volint'  )
      CHARACTER*(*) mon_foot_volmean
      PARAMETER (   mon_foot_volmean = '_volmean' )
      CHARACTER*(*) mon_foot_del2
      PARAMETER (   mon_foot_del2    = '_del2'    )
      CHARACTER*(*) mon_foot_vol
      PARAMETER (   mon_foot_vol     = '_vol'     )
      CHARACTER*(*) mon_string_none
      PARAMETER (   mon_string_none  = 'NONE'     )
      COMMON /MON_I/ mon_ioUnit, mon_prefL
      INTEGER mon_ioUnit
      INTEGER mon_prefL
      COMMON /MON_C/ mon_pref
      CHARACTER*(MAX_LEN_MBUF) mon_pref
      COMMON /MON_R/ monSolutionMaxRange
      Real*8  monSolutionMaxRange
      COMMON /MON_L/
     &               mon_write_stdout, mon_write_mnc
      LOGICAL mon_write_stdout, mon_write_mnc
      COMMON /MON_F/
     &     mon_fname
      CHARACTER*(MAX_LEN_FNAM) mon_fname
      INTEGER myThid
      LOGICAL  MASTER_CPU_IO
      EXTERNAL MASTER_CPU_IO
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      CALL LOAD_GRID_SPACING( myThid )
      CALL INI_VERTICAL_GRID( myThid )
      IF ( usingCartesianGrid ) THEN
        CALL INI_CARTESIAN_GRID( myThid )
      ELSEIF ( usingSphericalPolarGrid ) THEN
        CALL INI_SPHERICAL_POLAR_GRID( myThid )
      ELSEIF ( usingCurvilinearGrid ) THEN
        CALL INI_CURVILINEAR_GRID( myThid )
      ELSEIF ( usingCylindricalGrid ) THEN
        CALL INI_CYLINDER_GRID( myThid )
      ELSE
        IF ( myThid .EQ. 1 ) THEN
        WRITE(msgBuf,'(2A)') 'S/R INI_GRID: ',
     &       'No grid coordinate system has been selected'
        CALL PRINT_ERROR( msgBuf , myThid)
        STOP 'ABNORMAL END: S/R INI_GRID'
        ENDIF
      ENDIF
      IF ( MASTER_CPU_IO(myThid) ) THEN
        IF (monitor_stdio) THEN
          mon_write_stdout = .TRUE.
        ELSE
          mon_write_stdout = .FALSE.
        ENDIF
        mon_write_mnc = .FALSE.
      ENDIF
      CALL MON_PRINTSTATS_RS(1,xC,'XC',myThid)
      CALL MON_PRINTSTATS_RS(1,xG,'XG',myThid)
      CALL MON_PRINTSTATS_RS(1,dxC,'DXC',myThid)
      CALL MON_PRINTSTATS_RS(1,dxF,'DXF',myThid)
      CALL MON_PRINTSTATS_RS(1,dxG,'DXG',myThid)
      CALL MON_PRINTSTATS_RS(1,dxV,'DXV',myThid)
      CALL MON_PRINTSTATS_RS(1,yC,'YC',myThid)
      CALL MON_PRINTSTATS_RS(1,yG,'YG',myThid)
      CALL MON_PRINTSTATS_RS(1,dyC,'DYC',myThid)
      CALL MON_PRINTSTATS_RS(1,dyF,'DYF',myThid)
      CALL MON_PRINTSTATS_RS(1,dyG,'DYG',myThid)
      CALL MON_PRINTSTATS_RS(1,dyU,'DYU',myThid)
      CALL MON_PRINTSTATS_RS(1,rA,'RA',myThid)
      CALL MON_PRINTSTATS_RS(1,rAw,'RAW',myThid)
      CALL MON_PRINTSTATS_RS(1,rAs,'RAS',myThid)
      CALL MON_PRINTSTATS_RS(1,rAz,'RAZ',myThid)
      CALL MON_PRINTSTATS_RS(1,angleCosC,'AngleCS',myThid)
      CALL MON_PRINTSTATS_RS(1,angleSinC,'AngleSN',myThid)
      IF ( MASTER_CPU_IO(myThid) ) THEN
        mon_write_stdout = .FALSE.
        mon_write_mnc    = .FALSE.
      ENDIF
      CALL BARRIER(myThid)
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_HFAC( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      INTEGER bi, bj
      INTEGER  I, J, K
      DO bj=myByLo(myThid), myByHi(myThid)
       DO bi=myBxLo(myThid), myBxHi(myThid)
        DO K=1, Nr
         DO J=1-Oly,sNy+Oly
          DO I=1-Olx,sNx+Olx
           hFacC(I,J,K,bi,bj) = 0.d0
           hFacS(I,J,K,bi,bj) = 0.d0
           hFacW(I,J,K,bi,bj) = 0.d0
           maskC(I,J,K,bi,bj) = 0.d0
           maskS(I,J,K,bi,bj) = 0.d0
           maskW(I,J,K,bi,bj) = 0.d0
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_LINEAR_PHISURF( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      Real*8 tileArea(nSx,nSy), threadArea
      COMMON / LOCAL_INI_PHISURF / tileArea
      Real*8 topoHloc(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi, bj
      INTEGER I, J, K
      Real*8     pLoc, rhoLoc
      Real*8     dPIdp
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
        DO J=1-Oly,sNy+Oly
         DO I=1-Olx,sNx+Olx
           Bo_surf(I,J,bi,bj)  = 0.d0
           recip_Bo(I,J,bi,bj) = 0.d0
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      threadArea = 0.d0
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        tileArea(bi,bj) = 0.d0
        DO j=1,sNy
         DO i=1,sNx
          tileArea(bi,bj) = tileArea(bi,bj)
     &                    + rA(i,j,bi,bj)*maskInC(i,j,bi,bj)
         ENDDO
        ENDDO
       ENDDO
      ENDDO
C_jmc: apply GLOBAL_SUM to thread-local variable (not in common block)
      CALL GLOBAL_SUM_TILE_RL( tileArea, threadArea, myThid )
      IF (  myThid  .EQ. 1 ) THEN
      globalArea = threadArea
      msgBuf(1:1) = ' '
      DO bj = 1,nSy
       DO bi = 1,nSx
        IF ( tileArea(bi,bj).EQ.0.d0 ) THEN
         WRITE(msgBuf,'(A,I6,I6)') 'Empty tile bi,bj=', bi, bj
         CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                       SQUEEZE_RIGHT, myThid )
        ENDIF
       ENDDO
      ENDDO
      IF ( msgBuf(1:1).NE.' ' ) THEN
         WRITE(msgBuf,'(A)') ' '
         CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                       SQUEEZE_RIGHT, myThid )
      ENDIF
      ENDIF
      IF ( buoyancyRelation .EQ. 'OCEANIC' ) THEN
        DO bj=myByLo(myThid),myByHi(myThid)
         DO bi=myBxLo(myThid),myBxHi(myThid)
          DO J=1-Oly,sNy+Oly
           DO I=1-Olx,sNx+Olx
             Bo_surf(I,J,bi,bj) = gBaro
             recip_Bo(I,J,bi,bj) = 1.d0 / gBaro
           ENDDO
          ENDDO
         ENDDO
        ENDDO
      ELSEIF ( uniformLin_PhiSurf ) THEN
        DO bj=myByLo(myThid),myByHi(myThid)
         DO bi=myBxLo(myThid),myBxHi(myThid)
          DO J=1-Oly,sNy+Oly
           DO I=1-Olx,sNx+Olx
             Bo_surf(I,J,bi,bj)  = recip_rhoConst
             recip_Bo(I,J,bi,bj) = rhoConst
           ENDDO
          ENDDO
         ENDDO
        ENDDO
      ELSEIF ( buoyancyRelation .EQ. 'OCEANICP' ) THEN
        DO bj=myByLo(myThid),myByHi(myThid)
         DO bi=myBxLo(myThid),myBxHi(myThid)
          DO J=1-Oly,sNy+Oly
           DO I=1-Olx,sNx+Olx
            IF ( Ro_surf(I,J,bi,bj).GT.0.d0
     &          .AND. ksurfC(I,J,bi,bj).LE.Nr ) THEN
             k = ksurfC(I,J,bi,bj)
             pLoc = Ro_surf(I,J,bi,bj)
             CALL FIND_RHO_SCALAR(
     I            tRef(k), sRef(k), pLoc,
     O            rhoLoc, myThid )
             IF ( rhoLoc .EQ. 0.d0 ) THEN
              Bo_surf(I,J,bi,bj) = 0.d0
             ELSE
              Bo_surf(I,J,bi,bj) = 1.d0/rhoLoc
             ENDIF
             recip_Bo(I,J,bi,bj) =  rhoLoc
            ELSE
              Bo_surf(I,J,bi,bj)  = 0.d0
              recip_Bo(I,J,bi,bj) = 0.d0
            ENDIF
           ENDDO
          ENDDO
         ENDDO
        ENDDO
      ELSEIF ( buoyancyRelation .EQ. 'ATMOSPHERIC' ) THEN
        DO bj=myByLo(myThid),myByHi(myThid)
         DO bi=myBxLo(myThid),myBxHi(myThid)
          DO J=1-Oly,sNy+Oly
           DO I=1-Olx,sNx+Olx
            IF ( Ro_surf(I,J,bi,bj).GT.0.d0
     &          .AND. ksurfC(I,J,bi,bj).LE.Nr ) THEN
              dPIdp = (atm_Cp*atm_kappa/atm_Po)*
     &         (Ro_surf(I,J,bi,bj)/atm_Po)**(atm_kappa-1.d0)
              Bo_surf(I,J,bi,bj) = dPIdp*tRef(ksurfC(I,J,bi,bj))
              recip_Bo(I,J,bi,bj) = 1.d0 / Bo_surf(I,J,bi,bj)
            ELSE
              Bo_surf(I,J,bi,bj) = 0.
              recip_Bo(I,J,bi,bj) = 0.
            ENDIF
           ENDDO
          ENDDO
         ENDDO
        ENDDO
      ELSE
        STOP 'INI_LINEAR_PHISURF: We should never reach this point!'
      ENDIF
      CALL EXCH_XY_RL ( Bo_surf,  myThid )
      CALL EXCH_XY_RL ( recip_Bo,  myThid )
      IF ( ( buoyancyRelation .EQ. 'ATMOSPHERIC' .OR.
     &       buoyancyRelation .EQ. 'OCEANICP'         )
     &       .AND. .NOT.uniformLin_PhiSurf              ) THEN
        CALL WRITE_FLD_XY_RL( 'Bo_surf',' ',Bo_surf,0,myThid)
      ENDIF
        DO bj=myByLo(myThid),myByHi(myThid)
         DO bi=myBxLo(myThid),myBxHi(myThid)
          DO J=1-Oly,sNy+Oly
           DO I=1-Olx,sNx+Olx
             phi0surf(I,J,bi,bj) = 0.
           ENDDO
          ENDDO
         ENDDO
        ENDDO
      IF ( buoyancyRelation .EQ. 'ATMOSPHERIC'
     &                   .AND. topoFile.NE.' ' ) THEN
         STOP 'CANNOT PRESENTLY USE THIS OPTION WITH ADJOINT'
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_MASKS_ETC( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      Real*8 tmpfld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi, bj
      INTEGER i, j, k
      Real*8 hFacCtmp
      Real*8 hFacMnSz
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          IF ( dxG(i,j,bi,bj) .NE. 0. )
     &    recip_dxG(i,j,bi,bj) = 1.d0/dxG(i,j,bi,bj)
          IF ( dyG(i,j,bi,bj) .NE. 0. )
     &    recip_dyG(i,j,bi,bj) = 1.d0/dyG(i,j,bi,bj)
          IF ( dxC(i,j,bi,bj) .NE. 0. )
     &    recip_dxC(i,j,bi,bj) = 1.d0/dxC(i,j,bi,bj)
          IF ( dyC(i,j,bi,bj) .NE. 0. )
     &    recip_dyC(i,j,bi,bj) = 1.d0/dyC(i,j,bi,bj)
          IF ( dxF(i,j,bi,bj) .NE. 0. )
     &    recip_dxF(i,j,bi,bj) = 1.d0/dxF(i,j,bi,bj)
          IF ( dyF(i,j,bi,bj) .NE. 0. )
     &    recip_dyF(i,j,bi,bj) = 1.d0/dyF(i,j,bi,bj)
          IF ( dxV(i,j,bi,bj) .NE. 0. )
     &    recip_dxV(i,j,bi,bj) = 1.d0/dxV(i,j,bi,bj)
          IF ( dyU(i,j,bi,bj) .NE. 0. )
     &    recip_dyU(i,j,bi,bj) = 1.d0/dyU(i,j,bi,bj)
          IF ( rA (i,j,bi,bj) .NE. 0. )
     &    recip_rA (i,j,bi,bj) = 1.d0/rA (i,j,bi,bj)
          IF ( rAs(i,j,bi,bj) .NE. 0. )
     &    recip_rAs(i,j,bi,bj) = 1.d0/rAs(i,j,bi,bj)
          IF ( rAw(i,j,bi,bj) .NE. 0. )
     &    recip_rAw(i,j,bi,bj) = 1.d0/rAw(i,j,bi,bj)
          IF ( rAz(i,j,bi,bj) .NE. 0. )
     &    recip_rAz(i,j,bi,bj) = 1.d0/rAz(i,j,bi,bj)
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      IF ( selectSigmaCoord.EQ.0 ) THEN
      DO bj=myByLo(myThid), myByHi(myThid)
       DO bi=myBxLo(myThid), myBxHi(myThid)
        DO k=1, Nr
         hFacMnSz=max( hFacMin, min(hFacMinDr*recip_drF(k),1.d0) )
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           hFacCtmp = (rF(k)-R_low(i,j,bi,bj))*recip_drF(k)
           hFacCtmp=min( max( hFacCtmp, 0.d0) , 1.d0)
           IF (hFacCtmp.LT.hFacMnSz) THEN
            IF (hFacCtmp.LT.hFacMnSz*0.5) THEN
             hFacC(i,j,k,bi,bj)=0.
            ELSE
             hFacC(i,j,k,bi,bj)=hFacMnSz
            ENDIF
           ELSE
             hFacC(i,j,k,bi,bj)=hFacCtmp
           ENDIF
          ENDDO
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          R_low(i,j,bi,bj) = rF(1)
          DO k=Nr,1,-1
           R_low(i,j,bi,bj) = R_low(i,j,bi,bj)
     &                      - drF(k)*hFacC(i,j,k,bi,bj)
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      DO bj=myByLo(myThid), myByHi(myThid)
       DO bi=myBxLo(myThid), myBxHi(myThid)
        DO k=1, Nr
         hFacMnSz=max( hFacMin, min(hFacMinDr*recip_drF(k),1.d0) )
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           hFacCtmp = (rF(k)-Ro_surf(i,j,bi,bj))*recip_drF(k)
           hFacCtmp = hFacC(i,j,k,bi,bj) - max( hFacCtmp, 0.d0)
           hFacCtmp = max( hFacCtmp, 0.d0)
           IF (hFacCtmp.LT.hFacMnSz) THEN
            IF (hFacCtmp.LT.hFacMnSz*0.5) THEN
             hFacC(i,j,k,bi,bj)=0.
            ELSE
             hFacC(i,j,k,bi,bj)=hFacMnSz
            ENDIF
           ELSE
             hFacC(i,j,k,bi,bj)=hFacCtmp
           ENDIF
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      DO bj=myByLo(myThid), myByHi(myThid)
       DO bi=myBxLo(myThid), myBxHi(myThid)
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          tmpfld(i,j,bi,bj) = 0.
          kSurfC(i,j,bi,bj) = Nr+1
          Ro_surf(i,j,bi,bj) = R_low(i,j,bi,bj)
          DO k=Nr,1,-1
           Ro_surf(i,j,bi,bj) = Ro_surf(i,j,bi,bj)
     &                        + drF(k)*hFacC(i,j,k,bi,bj)
           IF (hFacC(i,j,k,bi,bj).NE.0.) THEN
            kSurfC(i,j,bi,bj) = k
            tmpfld(i,j,bi,bj) = tmpfld(i,j,bi,bj) + 1.
           ENDIF
          ENDDO
          kLowC(i,j,bi,bj) = 0
          DO k= 1, Nr
           IF (hFacC(i,j,k,bi,bj).NE.0) THEN
              kLowC(i,j,bi,bj) = k
           ENDIF
          ENDDO
          maskInC(i,j,bi,bj)= 0.
          IF ( kSurfC(i,j,bi,bj).LE.Nr ) maskInC(i,j,bi,bj)= 1.
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      CALL PLOT_FIELD_XYRS(R_low,
     &         'Model R_low (ini_masks_etc)', 1, myThid)
      CALL PLOT_FIELD_XYRS(Ro_surf,
     &         'Model Ro_surf (ini_masks_etc)', 1, myThid)
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          tmpfld(i,j,bi,bj) = Ro_surf(i,j,bi,bj) - R_low(i,j,bi,bj)
          IF ( tmpfld(i,j,bi,bj) .LE. 0. ) THEN
           recip_Rcol(i,j,bi,bj) = 0.
          ELSE
           recip_Rcol(i,j,bi,bj) = 1.d0 / tmpfld(i,j,bi,bj)
          ENDIF
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      DO bj=myByLo(myThid), myByHi(myThid)
       DO bi=myBxLo(myThid), myBxHi(myThid)
        DO k=1, Nr
         DO j=1-Oly,sNy+Oly
          hFacW(1-OLx,j,k,bi,bj)= 0.
          DO i=2-Olx,sNx+Olx
           hFacW(i,j,k,bi,bj)=
     &       MIN(hFacC(i,j,k,bi,bj),hFacC(i-1,j,k,bi,bj))
          ENDDO
         ENDDO
         DO i=1-Olx,sNx+Olx
           hFacS(i,1-OLy,k,bi,bj)= 0.
         ENDDO
         DO j=2-Oly,sNy+oly
          DO i=1-Olx,sNx+Olx
           hFacS(i,j,k,bi,bj)=
     &       MIN(hFacC(i,j,k,bi,bj),hFacC(i,j-1,k,bi,bj))
          ENDDO
         ENDDO
        ENDDO
        i = 1-OlX
        DO j=1-Oly,sNy+Oly
           rLowW (i,j,bi,bj) = 0.
           rSurfW(i,j,bi,bj) = 0.
        ENDDO
        j = 1-Oly
        DO i=1-Olx,sNx+Olx
           rLowS (i,j,bi,bj) = 0.
           rSurfS(i,j,bi,bj) = 0.
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=2-Olx,sNx+Olx
           rSurfW(i,j,bi,bj) =
     &           MIN( Ro_surf(i-1,j,bi,bj), Ro_surf(i,j,bi,bj) )
           rLowW(i,j,bi,bj)  =
     &           MAX(   R_low(i-1,j,bi,bj),   R_low(i,j,bi,bj) )
         ENDDO
        ENDDO
        DO j=2-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
           rSurfS(i,j,bi,bj) =
     &           MIN( Ro_surf(i,j-1,bi,bj), Ro_surf(i,j,bi,bj) )
           rLowS(i,j,bi,bj)  =
     &           MAX(   R_low(i,j-1,bi,bj),   R_low(i,j,bi,bj) )
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      CALL EXCH_UV_XYZ_RS(hFacW,hFacS,.FALSE.,myThid)
      CALL EXCH_UV_XY_RS( rSurfW, rSurfS, .FALSE., myThid )
      CALL EXCH_UV_XY_RS( rLowW,  rLowS,  .FALSE., myThid )
      DO bj=myByLo(myThid), myByHi(myThid)
       DO bi=myBxLo(myThid), myBxHi(myThid)
        DO k=1, Nr
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           IF (dyG(i,j,bi,bj).EQ.0.) hFacW(i,j,k,bi,bj)=0.
           IF (dxG(i,j,bi,bj).EQ.0.) hFacS(i,j,k,bi,bj)=0.
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      DO bj=myByLo(myThid), myByHi(myThid)
       DO bi=myBxLo(myThid), myBxHi(myThid)
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          kSurfW(i,j,bi,bj) = Nr+1
          kSurfS(i,j,bi,bj) = Nr+1
          DO k=Nr,1,-1
           IF (hFacW(i,j,k,bi,bj).NE.0.) kSurfW(i,j,bi,bj) = k
           IF (hFacS(i,j,k,bi,bj).NE.0.) kSurfS(i,j,bi,bj) = k
          ENDDO
          maskInW(i,j,bi,bj)= 0.
          IF ( kSurfW(i,j,bi,bj).LE.Nr ) maskInW(i,j,bi,bj)= 1.
          maskInS(i,j,bi,bj)= 0.
          IF ( kSurfS(i,j,bi,bj).LE.Nr ) maskInS(i,j,bi,bj)= 1.
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      ELSE
        CALL INI_SIGMA_HFAC( myThid )
      ENDIF
      CALL BARRIER(myThid)
      CALL PLOT_FIELD_XYZRS( hFacC, 'hFacC' , Nr, 1, myThid )
      CALL PLOT_FIELD_XYZRS( hFacW, 'hFacW' , Nr, 1, myThid )
      CALL PLOT_FIELD_XYZRS( hFacS, 'hFacS' , Nr, 1, myThid )
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO k=1,Nr
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           IF (hFacC(i,j,k,bi,bj) .NE. 0. ) THEN
            recip_hFacC(i,j,k,bi,bj) = 1.d0 / hFacC(i,j,k,bi,bj)
            maskC(i,j,k,bi,bj) = 1.
           ELSE
            recip_hFacC(i,j,k,bi,bj) = 0.
            maskC(i,j,k,bi,bj) = 0.
           ENDIF
           IF (hFacW(i,j,k,bi,bj) .NE. 0. ) THEN
            recip_hFacW(i,j,k,bi,bj) = 1.d0 / hFacW(i,j,k,bi,bj)
            maskW(i,j,k,bi,bj) = 1.
           ELSE
            recip_hFacW(i,j,k,bi,bj) = 0.
            maskW(i,j,k,bi,bj) = 0.
           ENDIF
           IF (hFacS(i,j,k,bi,bj) .NE. 0. ) THEN
            recip_hFacS(i,j,k,bi,bj) = 1.d0 / hFacS(i,j,k,bi,bj)
            maskS(i,j,k,bi,bj) = 1.
           ELSE
            recip_hFacS(i,j,k,bi,bj) = 0.
            maskS(i,j,k,bi,bj) = 0.
           ENDIF
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_MIXING( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      INTEGER bi, bj
      INTEGER i, j, k
       DO bj = myByLo(myThid), myByHi(myThid)
        DO bi = myBxLo(myThid), myBxHi(myThid)
         DO k=1,Nr
          DO j = 1-Oly, sNy+Oly
           DO i = 1-Olx, sNx+Olx
           ENDDO
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_NH_FIELDS( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER maxNoChkptLev
      PARAMETER ( maxNoChkptLev = 2 )
      COMMON / RESTART_I /
     &  nCheckLev,
     &  tempStartAB, saltStartAB,
     &  mom_StartAB, nHydStartAB,
     &  dPhiNHstatus
      INTEGER nCheckLev
      INTEGER tempStartAB
      INTEGER saltStartAB
      INTEGER mom_StartAB
      INTEGER nHydStartAB
      INTEGER dPhiNHstatus
      COMMON / RESTART_C /
     &  checkPtSuff
      CHARACTER*(5) checkPtSuff(maxNoChkptLev)
      INTEGER myThid
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_NLFS_VARS( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_P_GROUND(selectMode,
     &                        Hfld, Pfld,
     I                        myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER selectMode
      Real*8 Hfld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Pfld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      INTEGER bi,bj,i,j,K, Ks
      Real*8 Po_surf
      Real*8 hRef(2*Nr+1), rHalf(2*Nr+1)
      LOGICAL findPoSurf
      INTEGER nLevHvR
      PARAMETER ( nLevHvR = 60 )
      Real*8 plowHvR, dpHvR, pLevHvR(nLevHvR+1), pMidHvR(nLevHvR)
      Real*8 thetaHvR(nLevHvR), PiHvR(nLevHvR+1), dPiHvR(nLevHvR)
      Real*8 recip_kappa, PiLoc, zLoc, dzLoc, yLatLoc, phiLoc
      Real*8  psNorm, rMidKp1
      Real*8 ratioRm(Nr), ratioRp(Nr)
      INTEGER kLev
      IF ( selectFindRoSurf.LT.0 .OR. selectFindRoSurf.GT.1 ) THEN
        WRITE(msgBuf,'(A,I2,A)')
     &   'INI_P_GROUND: selectFindRoSurf =', selectFindRoSurf,
     &        ' <== bad value !'
        CALL PRINT_ERROR( msgBuf , myThid)
        STOP 'INI_P_GROUND'
      ENDIF
      DO K=1,Nr
        rHalf(2*K-1) = rF(K)
        rHalf(2*K)   = rC(K)
      ENDDO
       rHalf(2*Nr+1) = rF(Nr+1)
      DO K=1,2*Nr+1
        hRef(K) = phiRef(K)*recip_gravity
      ENDDO
      IF (selectFindRoSurf.EQ.0 .AND. selectMode .GT. 0 ) THEN
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO j=1,sNy
         DO i=1,sNx
           Ks = 1
           DO K=1,2*Nr
             IF (Hfld(i,j,bi,bj).GE.hRef(K)) Ks = K
           ENDDO
           Po_surf = rHalf(Ks) + (rHalf(Ks+1)-rHalf(Ks))*
     &       (Hfld(i,j,bi,bj)-hRef(Ks))/(hRef(Ks+1)-hRef(Ks))
           Pfld(i,j,bi,bj) = Po_surf
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      ENDIF
      IF ( selectFindRoSurf.EQ.1 ) THEN
      recip_kappa = 1.d0 / atm_kappa
      plowHvR = 0.4d0
      dpHvR = nLevHvR
      dpHvR = (1. - plowHvR) / dpHvR
        pLevHvR(1)= Ro_SeaLevel/atm_Po
        PiHvR(1) = atm_Cp*(pLevHvR(1)**atm_kappa)
      DO k=1,nLevHvR
        pLevHvR(k+1)= pLevHvR(1) - float(k)*dpHvR
        PiHvR(k+1)  = atm_Cp*(pLevHvR(k+1)**atm_kappa)
        pMidHvR(k)= (pLevHvR(k)+pLevHvR(k+1))*0.5d0
        dPiHvR(k) = PiHvR(k) - PiHvR(k+1)
      ENDDO
      DO k=1,Nr
         ratioRm(k) = 1.d0
         ratioRp(k) = 1.d0
         IF (k.GT.1 ) ratioRm(k) = 0.5d0*drC(k)/(rF(k)-rC(k))
         IF (k.LT.Nr) ratioRp(k) = 0.5d0*drC(k+1)/(rC(k)-rF(k+1))
      ENDDO
      ENDIF
      IF ( selectFindRoSurf*selectMode .GT. 0) THEN
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO j=1,sNy
         DO i=1,sNx
          IF ( Hfld(i,j,bi,bj) .LE. 0.d0) THEN
           Pfld(i,j,bi,bj) = Ro_SeaLevel
          ELSE
           yLatLoc  = yC(i,j,bi,bj)
           CALL ANALYLIC_THETA( yLatLoc , pMidHvR,
     &                       thetaHvR, nLevHvR, mythid)
           zLoc = 0.
           DO k=1,nLevHvR
            IF (zLoc.GE.0.) THEN
             dzLoc = dPiHvR(k)*thetaHvR(k)*recip_gravity
             IF ( Hfld(i,j,bi,bj) .LE. zLoc+dzLoc ) THEN
               PiLoc = PiHvR(k)
     &               - gravity*(Hfld(i,j,bi,bj)-zLoc)/thetaHvR(k)
               psNorm = (PiLoc/atm_Cp)**recip_kappa
               zLoc = -1.
             ELSE
               zLoc = zLoc + dzLoc
             ENDIF
            ENDIF
           ENDDO
           IF (zLoc.GE.0.) THEN
             WRITE(msgBuf,'(2A)')
     &        'INI_P_GROUND: FAIL in trying to find Pfld:',
     &        ' selectMode,i,j,bi,bj=',selectMode,i,j,bi,bj
             CALL PRINT_ERROR( msgBuf , myThid)
             WRITE(msgBuf,'(A,F7.1,2A,F6.4,A,F8.0)')
     &        'INI_P_GROUND: Hfld=', Hfld(i,j,bi,bj), ' exceeds',
     &        ' Zloc(lowest P=', pLevHvR(1+nLevHvR),' )=',zLoc
             CALL PRINT_ERROR( msgBuf , myThid)
             STOP 'ABNORMAL END: S/R INI_P_GROUND'
           ELSE
             Pfld(i,j,bi,bj) = psNorm*atm_Po
           ENDIF
          ENDIF
         ENDDO
        ENDDO
        IF (selectMode.EQ.2 .AND. integr_GeoPot.NE.1) THEN
          DO j=1,sNy
           DO i=1,sNx
             Po_surf = Pfld(i,j,bi,bj)
              IF ( Po_surf.LT.rC(1) .AND. Po_surf.GT.rC(Nr) ) THEN
                findPoSurf = .TRUE.
                DO k=1,Nr
                  IF ( findPoSurf .AND. Po_surf.GE.rC(k) ) THEN
                    Po_surf = rC(k) + (Po_surf-rC(k))/ratioRm(k)
                    findPoSurf = .FALSE.
                  ENDIF
                  rMidKp1 = rF(k+1)
                  IF (k.LT.Nr) rMidKp1 = (rC(k)+rC(k+1))*0.5d0
                  IF ( findPoSurf .AND. Po_surf.GE.rMidKp1 ) THEN
                    Po_surf = rC(k) + (Po_surf-rC(k))/ratioRp(k)
                    findPoSurf = .FALSE.
                  ENDIF
                ENDDO
                IF ( findPoSurf )
     &               STOP 'S/R INI_P_GROUND: Pb with selectMode=2'
              ENDIF
             Pfld(i,j,bi,bj) = Po_surf
           ENDDO
          ENDDO
        ENDIF
       ENDDO
      ENDDO
      ENDIF
      IF (selectMode .LT. 0) THEN
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO j=1,sNy
         DO i=1,sNx
          ks = kSurfC(i,j,bi,bj)
          IF (ks.LE.Nr) THEN
           IF ( selectSigmaCoord.NE.0 ) THEN
             DO k=2,Nr
               IF ( Pfld(i,j,bi,bj).LT.rF(k) ) ks = k
             ENDDO
           ENDIF
           IF ( Pfld(i,j,bi,bj).GE.rC(ks) ) THEN
            phiLoc = hRef(2*ks)
     &       + (hRef(2*ks-1)-hRef(2*ks))
     &        *(Pfld(i,j,bi,bj)-rC(ks))/(rHalf(2*ks-1)-rHalf(2*ks))
           ELSE
            phiLoc = hRef(2*ks)
     &       + (hRef(2*ks+1)-hRef(2*ks))
     &        *(Pfld(i,j,bi,bj)-rC(ks))/(rHalf(2*ks+1)-rHalf(2*ks))
           ENDIF
           Hfld(i,j,bi,bj) = phiLoc
          ELSE
           Hfld(i,j,bi,bj) = 0.
          ENDIF
         ENDDO
        ENDDO
        IF (selectFindRoSurf.EQ.1) THEN
         DO j=1,sNy
          DO i=1,sNx
           zLoc = 0.
           IF ( Pfld(i,j,bi,bj) .LT. Ro_SeaLevel) THEN
            Po_surf = Pfld(i,j,bi,bj)
             IF (selectMode.EQ.-2 .AND. integr_GeoPot.NE.1) THEN
              IF ( Po_surf.LT.rC(1) .AND. Po_surf.GT.rC(Nr) ) THEN
                findPoSurf = .TRUE.
                DO k=1,Nr
                  IF ( findPoSurf .AND. Po_surf.GE.rC(k) ) THEN
                    Po_surf = rC(k) + (Po_surf-rC(k))*ratioRm(k)
                    findPoSurf = .FALSE.
                  ENDIF
                  IF ( findPoSurf .AND. Po_surf.GE.rF(k+1) ) THEN
                    Po_surf = rC(k) + (Po_surf-rC(k))*ratioRp(k)
                    findPoSurf = .FALSE.
                  ENDIF
                ENDDO
              ENDIF
             ENDIF
            psNorm = Po_surf/atm_Po
            kLev = 1 + INT( (pLevHvR(1)-psNorm)/dpHvR )
            yLatLoc  = yC(i,j,bi,bj)
            CALL ANALYLIC_THETA( yLatLoc , pMidHvR,
     &                        thetaHvR, kLev, mythid)
            DO k=1,kLev-1
              dzLoc = dPiHvR(k)*thetaHvR(k)*recip_gravity
              zLoc = zLoc + dzLoc
            ENDDO
            dzLoc = ( PiHvR(kLev)-atm_Cp*(psNorm**atm_kappa) )
     &            * thetaHvR(kLev)*recip_gravity
            zLoc = zLoc + dzLoc
           ENDIF
           phi0surf(i,j,bi,bj) = gravity*(zLoc - Hfld(i,j,bi,bj))
           Hfld(i,j,bi,bj) = zLoc
          ENDDO
         ENDDO
        ENDIF
       ENDDO
      ENDDO
      ENDIF
      RETURN
      END
      SUBROUTINE ANALYLIC_THETA( yLat, pNlev,
     O                           thetaLev,
     I                           kSize,myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER kSize
      Real*8  yLat
      Real*8  pNlev  (kSize)
      Real*8  thetaLev(kSize)
      INTEGER myThid
      INTEGER k
      Real*8  yyA, yyB, yyC, yyAd, yyBd, yyCd
      Real*8  cAtmp, cBtmp, ttdC
      Real*8  ppN0, ppN1, ppN2, ppN3a, ppN3b, ppN4
      Real*8  ttp1, ttp2, ttp3, ttp4, ttp5
      Real*8  yAtmp, yBtmp, yCtmp, yDtmp
      Real*8  ttp2y, ttp4y, a1tmp
      Real*8  ppl, ppm, pph, ppr
      DATA yyA ,    yyB ,     yyC ,     yyAd ,   yyBd ,   yyCd
     &  / 45.d0, 65.d0, 65.d0, .9d0, .9d0, 10.d0 /
      DATA  cAtmp ,   cBtmp ,   ttdC
     &   /  2.6d0, 1.5d0, 3.3d0 /
      DATA  ppN0  ,   ppN1  ,  ppN2  ,  ppN3a ,  ppN3b ,  ppN4
     &   / .1d0, .19d0, .3d0, .9d0, .7d0, .925d0 /
      DATA ttp1 ,     ttp2 ,     ttp3 ,     ttp4 ,     ttp5
     &   / 350.d0, 342.d0, 307.d0, 301.d0, 257.d0 /
       yAtmp = ABS(yLat) - yyA
       yAtmp = yyA + MIN(0.d0,yAtmp/yyAd) + MAX(yAtmp, 0.d0)
       yAtmp = COS( deg2rad*MAX(yAtmp, 0.d0) )
       yBtmp = ABS(yLat) - yyB
       yBtmp = yyB + yBtmp/yyBd
       yBtmp = COS( deg2rad*MAX( 0.d0, MIN(yBtmp,90.d0) ) )
       yCtmp = ABS(yLat) - yyC
       yCtmp = MAX( 0.d0, 1.d0 - (yCtmp/yyCd)**2 )
       yDtmp = ppN3a +(ppN3b - ppN3a)*yCtmp
       ttp2y = ttp3 + (ttp2-ttp3)*yAtmp**cAtmp
       ttp4y = ttp5 + (ttp4-ttp5)*yBtmp**cBtmp
       a1tmp = (ttp1-ttp2y)*ppN1*ppN2/(ppN2-ppN1)
      DO k=1,kSize
       ppl = MIN(pNlev(k),ppN1)
       ppm = MIN(MAX(pNlev(k),ppN1),ppN2)
       pph = MAX(pNlev(k),ppN2)
       ppr =( ppN0 + ABS(ppl-ppN0) - ppN1 )/(ppN2-ppN1)
       thetaLev(k) =
     &       ( (1.d0 -ppr)*ttp1*ppN1**atm_kappa
     &        + ppr*ttp2y*ppN2**atm_kappa
     &       )*ppl**(-atm_kappa)
     &     + a1tmp*(1.d0 /ppm - 1.d0/ppN1)
     &     + (ttp4y-ttp2y)*(pph-ppN2)/(ppN4-ppN2)
     &     + (ttdC+yCtmp)*MAX(0.d0,pNlev(k)-yDtmp)/(1-yDtmp)
      ENDDO
C
C
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_PRESSURE( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      Real*8 SItoBar, SItodBar
      PARAMETER ( SItoBar  = 1.D-05 )
      PARAMETER ( SItodBar = 1.D-04 )
      COMMON /PARM_EOS_LIN/ tAlpha,sBeta,equationOfState
      Real*8 tAlpha
      Real*8 sBeta
      character*(6) equationOfState
      COMMON /PARM_EOS_NL/ eosC,eosSig0,eosRefT,eosRefS
      Real*8 eosC(9,Nr+1),eosSig0(Nr+1),eosRefT(Nr+1),eosRefS(Nr+1)
      Real*8 eosJMDCFw(6), eosJMDCSw(9)
      Real*8 eosJMDCKFw(5), eosJMDCKSw(7), eosJMDCKP(14)
      COMMON /PARM_EOS_JMD95/
     &     eosJMDCFw, eosJMDCSw, eosJMDCKFw, eosJMDCKSw, eosJMDCKP
      Real*8 eosMDJWFnum(0:11), eosMDJWFden(0:12)
      COMMON /PARM_EOS_MDJWF/ 
     &     eosMDJWFnum, eosMDJWFden
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      INTEGER bi, bj
      INTEGER  i,  j, k
      INTEGER  iMin, iMax, jMin, jMax, npiter
      Real*8 PhiHydF (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 PhiHydC (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 dPhiHydX(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 dPhiHydY(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 oldPhi  (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 count, rmspp, rmsppold
      Real*8 sumTile, rmsTile
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      iMin = 1-OLx
      iMax = sNx+OLx
      jMin = 1-OLy
      jMax = sNy+OLy
      IF (  myThid  .EQ. 1 ) THEN
      WRITE(msgBuf,'(a)')
     &     'Start initial hydrostatic pressure computation'
      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &     SQUEEZE_RIGHT , myThid)
      ENDIF
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO k = 1,Nr
         DO j=1-OLy,sNy+OLy
          DO i=1-OLx,sNx+OLx
           totPhiHyd(i,j,k,bi,bj) = 0.d0
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      IF ( useDynP_inEos_Zc ) THEN
      ELSE
       IF (  myThid  .EQ. 1 ) THEN
       WRITE(msgBuf,'(A,A)')
     &        'Pressure is predetermined for buoyancyRelation ',
     &        buoyancyRelation(1:11)
       CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &      SQUEEZE_RIGHT , myThid)
       ENDIF
      ENDIF
      IF (  myThid  .EQ. 1 ) THEN
      WRITE(msgBuf,'(A)') ' '
      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &     SQUEEZE_RIGHT , myThid)
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_PSURF( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_CD/
     &                   uVelD, vVelD,
     &                   etaNm1,
     &                   uNM1,  vNM1
      Real*8  uVelD (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVelD (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  etaNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uNM1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vNM1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      INTEGER bi, bj
      INTEGER  I,  J
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO J=1-Oly,sNy+Oly
         DO I=1-Olx,sNx+Olx
          etaN(I,J,bi,bj) = 0.d0
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      IF (pSurfInitFile .NE. ' ') THEN
       CALL READ_FLD_XY_RL( pSurfInitFile, ' ', etaN, 0, myThid )
       CALL EXCH_XY_RL ( etaN,  myThid )
      ENDIF
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
        DO J=1-Oly,sNy+Oly
         DO I=1-Olx,sNx+Olx
          etaNm1(I,J,bi,bj) = etaN(I,J,bi,bj)
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          etaH(i,j,bi,bj) = etaN(i,j,bi,bj)
          etaHnm1(i,j,bi,bj) = etaN(i,j,bi,bj)
          dEtaHdt(i,j,bi,bj) = 0.d0
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_SALT( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      INTEGER bi, bj
      INTEGER i, j, k, localWarnings
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO k=1,Nr
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           salt(i,j,k,bi,bj) = sRef(k)
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      IF ( hydrogSaltFile .NE. ' ' ) THEN
          CALL READ_FLD_XYZ_RL( hydrogSaltFile, ' ', salt, 0, myThid )
        CALL EXCH_XYZ_RL (  salt,  myThid  )
      ENDIF
      localWarnings=0
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO k=1,Nr
         IF ( maskIniSalt ) THEN
          DO j=1-Oly,sNy+Oly
           DO i=1-Olx,sNx+Olx
            IF (maskC(i,j,k,bi,bj).EQ.0.) salt(i,j,k,bi,bj) = 0.
           ENDDO
          ENDDO
         ENDIF
         IF ( sRef(k).NE.0. ) THEN
          DO j=1,sNy
           DO i=1,sNx
            IF ( maskC(i,j,k,bi,bj).NE.0.
     &      .AND. salt(i,j,k,bi,bj).EQ.0. ) THEN
              localWarnings=localWarnings+1
            ENDIF
           ENDDO
          ENDDO
         ENDIF
        ENDDO
       ENDDO
      ENDDO
      IF ( localWarnings.NE.0 ) THEN
       IF ( checkIniSalt ) THEN
        WRITE(msgBuf,'(A,I10,A)')
     &   ' INI_SALT: found', localWarnings,
     &   ' wet grid-pts with salt=0 identically.'
        CALL PRINT_ERROR( msgBuf , myThid)
        WRITE(msgBuf,'(A,A)')
     &  ' If this is intentional, you need to',
     &  ' set checkIniSalt=.false. in "data", namelist PARM05'
        CALL PRINT_ERROR( msgBuf , myThid)
        STOP 'ABNORMAL END: S/R INI_SALT'
       ELSE
        WRITE(msgBuf,'(A,I10,A)')
     &   '** WARNINGS ** INI_SALT: found', localWarnings,
     &   ' wet grid-pts with salt=0 identically.'
        CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
     &                      SQUEEZE_RIGHT, myThid )
       ENDIF
      ENDIF
      IF (debugMode) THEN
        CALL PLOT_FIELD_XYZRL( salt, 'Initial Salinity',
     &                         Nr, 1, myThid )
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_SIGMA_HFAC( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      INTEGER bi, bj
      INTEGER i, j, k
      Real*8 rEmpty
      Real*8 rFullDepth
      Real*8 tmpFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 min_hFac
      Real*8 hFactmp
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      IF ( usingPCoords ) rEmpty = rF(Nr+1)
      IF ( usingZCoords ) rEmpty = rF(1)
      rFullDepth = rF(1)-rF(Nr+1)
      min_hFac = 1.
      DO bj=myByLo(myThid), myByHi(myThid)
       DO bi=myBxLo(myThid), myBxHi(myThid)
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
           tmpFld(i,j) = Ro_surf(i,j,bi,bj)-R_low(i,j,bi,bj)
           IF ( tmpFld(i,j).LT.hFacInf*rFullDepth )
     &       tmpFld(i,j) = 0.d0
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
           IF ( tmpFld(i,j).GT.0.d0 ) THEN
             kSurfC (i,j,bi,bj) = 1
             kLowC  (i,j,bi,bj) = Nr
             maskInC(i,j,bi,bj) = 1.
             recip_Rcol(i,j,bi,bj) = 1.d0 / tmpFld(i,j)
           ELSE
             kSurfC (i,j,bi,bj) = Nr+1
             kLowC  (i,j,bi,bj) = 0
             maskInC(i,j,bi,bj) = 0.
             recip_Rcol(i,j,bi,bj) = 0.d0
             Ro_surf(i,j,bi,bj) = rEmpty
             R_low(i,j,bi,bj)   = rEmpty
           ENDIF
         ENDDO
        ENDDO
        DO k=1, Nr
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           IF ( maskInC(i,j,bi,bj).NE.0.d0 ) THEN
             hFactmp = ( dAHybSigF(k)*rFullDepth
     &                 + dBHybSigF(k)*tmpFld(i,j)
     &                 )*recip_drF(k)
             hFacC(i,j,k,bi,bj) = hFactmp
             min_hFac = MIN( min_hFac, hFactmp )
           ELSE
             hFacC(i,j,k,bi,bj) = 0.
           ENDIF
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      WRITE(msgBuf,'(A,1PE14.6)')
     &     'S/R INI_SIGMA_HFAC: minimum hFacC=', min_hFac
      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                    SQUEEZE_RIGHT, myThid )
      DO bj=myByLo(myThid), myByHi(myThid)
       DO bi=myBxLo(myThid), myBxHi(myThid)
        i = 1-OlX
        DO j=1-Oly,sNy+Oly
           rSurfW(i,j,bi,bj) = rEmpty
           rLowW (i,j,bi,bj) = rEmpty
           maskInW(i,j,bi,bj)= 0.
        ENDDO
        j = 1-Oly
        DO i=1-Olx,sNx+Olx
           rSurfS(i,j,bi,bj) = rEmpty
           rLowS (i,j,bi,bj) = rEmpty
           maskInS(i,j,bi,bj)= 0.
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=2-Olx,sNx+Olx
           maskInW(i,j,bi,bj)= maskInC(i-1,j,bi,bj)*maskInC(i,j,bi,bj)
           rSurfW(i,j,bi,bj) =
     &               ( Ro_surf(i-1,j,bi,bj)
     &               + Ro_surf( i, j,bi,bj) )*0.5d0
           rLowW(i,j,bi,bj)  =
     &                 ( R_low(i-1,j,bi,bj)
     &                 + R_low( i, j,bi,bj) )*0.5d0
           IF ( maskInW(i,j,bi,bj).EQ.0. ) THEN
             rSurfW(i,j,bi,bj) = rEmpty
             rLowW (i,j,bi,bj) = rEmpty
           ENDIF
         ENDDO
        ENDDO
        DO j=2-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
           maskInS(i,j,bi,bj)= maskInC(i,j-1,bi,bj)*maskInC(i,j,bi,bj)
           rSurfS(i,j,bi,bj) =
     &               ( Ro_surf(i,j-1,bi,bj)
     &               + Ro_surf(i, j, bi,bj) )*0.5d0
           rLowS(i,j,bi,bj)  =
     &                 ( R_low(i,j-1,bi,bj)
     &                 + R_low(i, j, bi,bj) )*0.5d0
           IF ( maskInS(i,j,bi,bj).EQ.0. ) THEN
             rSurfS(i,j,bi,bj) = rEmpty
             rLowS (i,j,bi,bj) = rEmpty
           ENDIF
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      CALL EXCH_UV_XY_RS( rSurfW,  rSurfS,  .FALSE., myThid )
      CALL EXCH_UV_XY_RS( rLowW,   rLowS,   .FALSE., myThid )
      CALL EXCH_UV_XY_RS( maskInW, maskInS, .FALSE., myThid )
      DO bj=myByLo(myThid), myByHi(myThid)
       DO bi=myBxLo(myThid), myBxHi(myThid)
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
           IF (dyG(i,j,bi,bj).EQ.0.) maskInW(i,j,bi,bj) = 0.
           IF (dxG(i,j,bi,bj).EQ.0.) maskInS(i,j,bi,bj) = 0.
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      DO bj=myByLo(myThid), myByHi(myThid)
       DO bi=myBxLo(myThid), myBxHi(myThid)
        DO k=1, Nr
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
            hFactmp =
     &          ( dAHybSigF(k)*rFullDepth
     &          + dBHybSigF(k)*( rSurfW(i,j,bi,bj)-rLowW(i,j,bi,bj) )
     &          )*recip_drF(k)
            hFacW(i,j,k,bi,bj) = hFactmp*maskInW(i,j,bi,bj)
          ENDDO
         ENDDO
        ENDDO
        DO k=1, Nr
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
            hFactmp =
     &          ( dAHybSigF(k)*rFullDepth
     &          + dBHybSigF(k)*( rSurfS(i,j,bi,bj)-rLowS(i,j,bi,bj) )
     &          )*recip_drF(k)
            hFacS(i,j,k,bi,bj) = hFactmp*maskInS(i,j,bi,bj)
          ENDDO
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
           kSurfW(i,j,bi,bj) = Nr+1
           kSurfS(i,j,bi,bj) = Nr+1
           IF ( maskInW(i,j,bi,bj).NE.0. ) kSurfW(i,j,bi,bj) = 1
           IF ( maskInS(i,j,bi,bj).NE.0. ) kSurfS(i,j,bi,bj) = 1
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_SPHERICAL_POLAR_GRID( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      INTEGER iG, jG
      INTEGER bi, bj
      INTEGER i,  j
      Real*8 lat, dlat, dlon, xG0, yG0
      Real*8 xGloc(1-Olx:sNx+Olx+1,1-Oly:sNy+Oly+1)
      Real*8 yGloc(1-Olx:sNx+Olx+1,1-Oly:sNy+Oly+1)
      INTEGER iGl,jGl
      iGl(i,bi) = 1+MOD(myXGlobalLo-1+(bi-1)*sNx+i+Olx*Nx-1,Nx)
      jGl(j,bj) = 1+MOD(myYGlobalLo-1+(bj-1)*sNy+j+Oly*Ny-1,Ny)
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        jG = myYGlobalLo + (bj-1)*sNy
        iG = myXGlobalLo + (bi-1)*sNx
cC- note: does not work for non-uniform delX or delY
        xG0 = xgOrigin
        DO i=1, iG-1
         xG0 = xG0 + delX(i)
        ENDDO
        DO i=1, Olx
         xG0 = xG0 - delX( 1+MOD(Olx*Nx-1+iG-i,Nx) )
        ENDDO
        yG0 = ygOrigin
        DO j=1, jG-1
         yG0 = yG0 + delY(j)
        ENDDO
        DO j=1, Oly
         yG0 = yG0 - delY( 1+MOD(Oly*Ny-1+jG-j,Ny) )
        ENDDO
        DO j=1-Oly,sNy+Oly +1
         xGloc(1-Olx,j) = xG0
         DO i=1-Olx,sNx+Olx
          xGloc(i+1,j) = xGloc(i,j) + delX( iGl(i,bi) )
         ENDDO
        ENDDO
        DO i=1-Olx,sNx+Olx +1
         yGloc(i,1-Oly) = yG0
         DO j=1-Oly,sNy+Oly
          yGloc(i,j+1) = yGloc(i,j) + delY( jGl(j,bj) )
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          xG(i,j,bi,bj) = xGloc(i,j)
          yG(i,j,bi,bj) = yGloc(i,j)
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          xC(i,j,bi,bj) = 0.25d0*(
     &     xGloc(i,j)+xGloc(i+1,j)+xGloc(i,j+1)+xGloc(i+1,j+1) )
          yC(i,j,bi,bj) = 0.25d0*(
     &     yGloc(i,j)+yGloc(i+1,j)+yGloc(i,j+1)+yGloc(i+1,j+1) )
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          lat = yC(i,j,bi,bj)
          dlon = delX( iGl(i,bi) )
          dlat = delY( jGl(j,bj) )
          dxF(i,j,bi,bj) = rSphere*COS(deg2rad*lat)*dlon*deg2rad
          dyF(i,j,bi,bj) = rSphere*dlat*deg2rad
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          lat = 0.5d0*(yGloc(i,j)+yGloc(i+1,j))
          dlon = delX( iGl(i,bi) )
          dlat = delY( jGl(j,bj) )
          dxG(i,j,bi,bj) = rSphere*COS(deg2rad*lat)*dlon*deg2rad
          if (dxG(i,j,bi,bj).LT.1.) dxG(i,j,bi,bj)=0.
          dyG(i,j,bi,bj) = rSphere*dlat*deg2rad
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          dxC(i,j,bi,bj) = 0.
          dyC(i,j,bi,bj) = 0.
          dxV(i,j,bi,bj) = 0.
          dyU(i,j,bi,bj) = 0.
          rAw(i,j,bi,bj) = 0.
          rAs(i,j,bi,bj) = 0.
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx+1,sNx+Olx ! NOTE range
          dxC(i,j,bi,bj) = 0.5d0*(dxF(i,j,bi,bj)+dxF(i-1,j,bi,bj))
         ENDDO
        ENDDO
        DO j=1-Oly+1,sNy+Oly ! NOTE range
         DO i=1-Olx,sNx+Olx
          dyC(i,j,bi,bj) = 0.5d0*(dyF(i,j,bi,bj)+dyF(i,j-1,bi,bj))
         ENDDO
        ENDDO
        DO j=1-Oly+1,sNy+Oly ! NOTE range
         DO i=1-Olx+1,sNx+Olx ! NOTE range
          dxV(i,j,bi,bj) = 0.5d0*(dxG(i,j,bi,bj)+dxG(i-1,j,bi,bj))
          dyU(i,j,bi,bj) = 0.5d0*(dyG(i,j,bi,bj)+dyG(i,j-1,bi,bj))
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          lat=0.5d0*(yGloc(i,j)+yGloc(i+1,j))
          dlon=delX( iGl(i,bi) )
          dlat=delY( jGl(j,bj) )
          rA(i,j,bi,bj) = rSphere*rSphere*dlon*deg2rad
     &        *ABS( SIN((lat+dlat)*deg2rad)-SIN(lat*deg2rad) )
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx+1,sNx+Olx ! NOTE range
          rAw(i,j,bi,bj) = 0.5d0*(rA(i,j,bi,bj)+rA(i-1,j,bi,bj))
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          lat=yC(i,j,bi,bj)
          dlon=delX( iGl(i,bi) )
          dlat=0.5d0*( delY( jGl(j,bj) ) + delY( jGl(j-1,bj) ) )
          rAs(i,j,bi,bj) = rSphere*rSphere*dlon*deg2rad
     &        *ABS( SIN(lat*deg2rad)-SIN((lat-dlat)*deg2rad) )
          IF (ABS(lat).GT.90..OR.ABS(lat-dlat).GT.90.) rAs(i,j,bi,bj)=0.
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          lat =0.5d0*(yGloc(i,j)+yGloc(i,j+1))
          dlon=0.5d0*( delX( iGl(i,bi) ) + delX( iGl(i-1,bi) ) )
          dlat=0.5d0*( delY( jGl(j,bj) ) + delY( jGl(j-1,bj) ) )
          rAz(i,j,bi,bj) = rSphere*rSphere*dlon*deg2rad
     &     *ABS( SIN(lat*deg2rad)-SIN((lat-dlat)*deg2rad) )
          IF (ABS(lat).GT.90..OR.ABS(lat-dlat).GT.90.) rAz(i,j,bi,bj)=0.
         ENDDO
        ENDDO
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
          lat=0.5d0*(yGloc(i,j)+yGloc(i,j+1))
          tanPhiAtU(i,j,bi,bj)=TAN(lat*deg2rad)
          lat=0.5d0*(yGloc(i,j)+yGloc(i+1,j))
          tanPhiAtV(i,j,bi,bj)=TAN(lat*deg2rad)
          angleCosC(i,j,bi,bj) = 1.
          angleSinC(i,j,bi,bj) = 0.
         ENDDO
        ENDDO
        DO j=1-OLy,sNy+OLy
         jG = myYGlobalLo + (bj-1)*sNy + j-1
         jG = MIN(MAX(1,jG),Ny)
         IF (cosPower.NE.0.) THEN
          cosFacU(j,bi,bj)=COS(yC(1,j,bi,bj)*deg2rad)
     &                    **cosPower
          cosFacV(j,bi,bj)=COS((yC(1,j,bi,bj)-0.5*delY(jG))*deg2rad)
     &                    **cosPower
          cosFacU(j,bi,bj)=ABS(cosFacU(j,bi,bj))
          cosFacV(j,bi,bj)=ABS(cosFacV(j,bi,bj))
          sqcosFacU(j,bi,bj)=SQRT(cosFacU(j,bi,bj))
          sqcosFacV(j,bi,bj)=SQRT(cosFacV(j,bi,bj))
         ELSE
          cosFacU(j,bi,bj)=1.
          cosFacV(j,bi,bj)=1.
          sqcosFacU(j,bi,bj)=1.
          sqcosFacV(j,bi,bj)=1.
         ENDIF
        ENDDO
       ENDDO ! bi
      ENDDO ! bj
      IF ( rotateGrid ) THEN
       CALL ROTATE_SPHERICAL_POLAR_GRID( xC, yC, myThid )
       CALL ROTATE_SPHERICAL_POLAR_GRID( xG, yG, myThid )
       CALL CALC_ANGLES( myThid )
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_THETA( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      INTEGER bi, bj
      INTEGER i, j, k, localWarnings
      Real*8     Tfreezing
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO k=1,Nr
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           theta(i,j,k,bi,bj) = tRef(k)
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      IF ( hydrogThetaFile .NE. ' ' ) THEN
          CALL READ_FLD_XYZ_RL( hydrogThetaFile, ' ', theta, 0, myThid )
        CALL EXCH_XYZ_RL ( theta, myThid )
      ENDIF
      localWarnings=0
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO k=1,Nr
         IF ( maskIniTemp ) THEN
          DO j=1-Oly,sNy+Oly
           DO i=1-Olx,sNx+Olx
            IF (maskC(i,j,k,bi,bj).EQ.0.) theta(i,j,k,bi,bj) = 0.
           ENDDO
          ENDDO
         ENDIF
         IF ( tRef(k).NE.0. ) THEN
          DO j=1,sNy
           DO i=1,sNx
            IF (  maskC(i,j,k,bi,bj).NE.0.
     &      .AND. theta(i,j,k,bi,bj).EQ.0. ) THEN
              localWarnings=localWarnings+1
            ENDIF
           ENDDO
          ENDDO
         ENDIF
        ENDDO
       ENDDO
      ENDDO
      IF (localWarnings.NE.0) THEN
       IF ( checkIniTemp ) THEN
        WRITE(msgBuf,'(A,I10,A)')
     &   ' INI_THETA: found', localWarnings,
     &   ' wet grid-pts with theta=0 identically.'
        CALL PRINT_ERROR( msgBuf , myThid)
        WRITE(msgBuf,'(A,A)')
     &  ' If this is intentional, you need to',
     &  ' set checkIniTemp=.false. in "data", namelist PARM05'
        CALL PRINT_ERROR( msgBuf , myThid)
        STOP 'ABNORMAL END: S/R INI_THETA'
       ELSE
        WRITE(msgBuf,'(A,I10,A)')
     &   '** WARNINGS ** INI_THETA: found', localWarnings,
     &   ' wet grid-pts with theta=0 identically.'
        CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
     &                      SQUEEZE_RIGHT, myThid )
       ENDIF
      ENDIF
      Tfreezing=-1.9d0
      IF ( allowFreezing ) THEN
       DO bj = myByLo(myThid), myByHi(myThid)
        DO bi = myBxLo(myThid), myBxHi(myThid)
         DO k=1,Nr
          DO j=1-Oly,sNy+Oly
           DO i=1-Olx,sNx+Olx
            IF (theta(i,j,k,bi,bj) .LT. Tfreezing) THEN
               theta(i,j,k,bi,bj) = Tfreezing
            ENDIF
           ENDDO
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDIF
      IF (debugMode) THEN
        CALL PLOT_FIELD_XYZRL( theta, 'Initial Temperature',
     &                         Nr, 1, myThid )
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_DYNVARS( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      INTEGER bi, bj
      INTEGER I, J, K
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO K=1,Nr
         DO J=1-Oly,sNy+Oly
          DO I=1-Olx,sNx+Olx
           uVel(I,J,K,bi,bj)=0.d0
           vVel(I,J,K,bi,bj)=0.d0
           wVel(I,J,K,bi,bj)=0.d0
           theta(I,J,K,bi,bj)=0.d0
           salt(I,J,K,bi,bj)=0.d0
           gU(I,J,K,bi,bj)=0.d0
           gV(I,J,K,bi,bj)=0.d0
           gT(I,J,K,bi,bj)=0.d0
           gS(I,J,K,bi,bj)=0.d0
           guNm1(I,J,K,bi,bj) =0.d0
           gvNm1(I,J,K,bi,bj) =0.d0
           gtNm1(I,J,K,bi,bj) =0.d0
           gsNm1(I,J,K,bi,bj) =0.d0
           totPhiHyd(I,J,K,bi,bj)=0.d0
           rhoInSitu(I,J,K,bi,bj)=0.d0
           IVDConvCount(i,j,k,bi,bj) = 0.d0
          ENDDO
         ENDDO
        ENDDO
        DO J=1-Oly,sNy+Oly
         DO I=1-Olx,sNx+Olx
          etaN(I,J,bi,bj)=0.d0
          etaH(I,J,bi,bj)=0.d0
          phiHydLow(I,J,bi,bj)=0.d0
          hMixLayer(I,J,bi,bj)=0.d0
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_VEL( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      INTEGER bi,bj,i,j,k
C
C
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO k=1,Nr
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           uVel(i,j,k,bi,bj)=0.d0
           vVel(i,j,k,bi,bj)=0.d0
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      IF (uVelInitFile .NE. ' ' .OR. vVelInitFile .NE. ' ') THEN
       IF (uVelInitFile .NE. ' ')
     & CALL READ_FLD_XYZ_RL( uVelInitFile, ' ', uVel, 0, myThid )
       IF (vVelInitFile .NE. ' ')
     & CALL READ_FLD_XYZ_RL( vVelInitFile, ' ', vVel, 0, myThid )
       CALL EXCH_UV_XYZ_RL(uVel,vVel,.TRUE.,myThid)
      ENDIF
      DO bj = myByLo(myThid), myByHi(myThid)
       DO bi = myBxLo(myThid), myBxHi(myThid)
        DO k=1,Nr
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           uVel(i,j,k,bi,bj)=uVel(i,j,k,bi,bj)*maskW(i,j,k,bi,bj)
           vVel(i,j,k,bi,bj)=vVel(i,j,k,bi,bj)*maskS(i,j,k,bi,bj)
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INI_VERTICAL_GRID( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      INTEGER k
      Real*8     tmpRatio, checkRatio1, checkRatio2
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      Real*8 maxErrC, maxErrF, epsil, tmpError
      Real*8 rFullDepth, recip_fullDepth
      Real*8 rSigBndRS, tmpRS
      IF ( myThid .EQ. 1 ) THEN
      WRITE(msgBuf,'(A,2(A,L5))') 'Enter INI_VERTICAL_GRID:',
     &                            ' setInterFDr=', setInterFDr,
     &                          ' ; setCenterDr=', setCenterDr
      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                    SQUEEZE_RIGHT, myThid )
      rkSign       = -1.d0
      gravitySign  = -1.d0
      IF ( usingPCoords ) THEN
         gravitySign = 1.d0
      ENDIF
      IF ( .NOT.(setInterFDr.OR.setCenterDr) ) THEN
        WRITE(msgBuf,'(A)')
     &  'S/R INI_VERTICAL_GRID: neither delR nor delRc are defined'
        CALL PRINT_ERROR( msgBuf, myThid )
        WRITE(msgBuf,'(A)')
     &  'S/R INI_VERTICAL_GRID: Need at least 1 of the 2 (delR,delRc)'
        CALL PRINT_ERROR( msgBuf, myThid )
        STOP 'ABNORMAL END: S/R INI_VERTICAL_GRID'
      ENDIF
      IF (setInterFDr) THEN
       DO k=1,Nr
         drF(k) = delR(k)
       ENDDO
       DO k=1,Nr
        IF (delR(k).LE.0.) THEN
         WRITE(msgBuf,'(A,I4,A,E16.8)')
     &  'S/R INI_VERTICAL_GRID: delR(k=',k,' )=',delR(k)
         CALL PRINT_ERROR( msgBuf, myThid )
         WRITE(msgBuf,'(A)')
     &  'S/R INI_VERTICAL_GRID: Vert. grid spacing MUST BE > 0'
         CALL PRINT_ERROR( msgBuf, myThid )
         STOP 'ABNORMAL END: S/R INI_VERTICAL_GRID'
        ENDIF
       ENDDO
      ELSE
       drF(1) = delRc(1)
       DO k=2,Nr
         drF(k-1) = 0.5d0 *delRc(k) + drF(k-1)
         drF( k ) = 0.5d0 *delRc(k)
       ENDDO
       drF(Nr) = delRc(Nr+1) + drF(Nr)
      ENDIF
      IF (setCenterDr) THEN
       DO k=1,Nr
         drC(k) = delRc(k)
       ENDDO
       DO k=1,Nr+1
        IF (delRc(k).LE.0.) THEN
         WRITE(msgBuf,'(A,I4,A,E16.8)')
     &  'S/R INI_VERTICAL_GRID: delRc(k=',k,' )=',delRc(k)
         CALL PRINT_ERROR( msgBuf, myThid )
         WRITE(msgBuf,'(A)')
     &  'S/R INI_VERTICAL_GRID: Vert. grid spacing MUST BE > 0'
         CALL PRINT_ERROR( msgBuf, myThid )
         STOP 'ABNORMAL END: S/R INI_VERTICAL_GRID'
        ENDIF
       ENDDO
      ELSE
       drC(1)  = 0.5d0 *delR(1)
       DO k=2,Nr
         drC(k) = 0.5d0 *(delR(k-1)+delR(k))
       ENDDO
      ENDIF
      rF(1)    = Ro_SeaLevel
      DO k=1,Nr
       rF(k+1) = rF(k)  + rkSign*drF(k)
      ENDDO
      rC(1)   = rF(1)   + rkSign*drC(1)
      DO k=2,Nr
        rC(k) = rC(k-1) + rkSign*drC(k)
      ENDDO
      checkRatio2 = 100.
      checkRatio1 = 1.d0 / checkRatio2
      DO k=1,Nr
       tmpRatio = 0.
       IF ( (rC(k)-rF(k+1)) .NE. 0. )
     &   tmpRatio = (rF(k)-rC(k)) / (rC(k)-rF(k+1))
       IF ( tmpRatio.LT.checkRatio1 .OR. tmpRatio.GT.checkRatio2 ) THEN
        WRITE(msgBuf,'(A,I4,A,E16.8)')
     &   'S/R INI_VERTICAL_GRID: Invalid relative position, level k=',
     &     k, ' :', tmpRatio
        CALL PRINT_ERROR( msgBuf, myThid )
        WRITE(msgBuf,'(A,1PE14.6,A,2E14.6)')
     &   'S/R INI_VERTICAL_GRID: rC=', rC(k),
     &   ' , rF(k,k+1)=',rF(k),rF(k+1)
        CALL PRINT_ERROR( msgBuf, myThid )
        STOP 'ABNORMAL END: S/R INI_VERTICAL_GRID'
       ENDIF
      ENDDO
      DO k=1,Nr
       recip_drC(k)   = 1.d0/drC(k)
       recip_drF(k)   = 1.d0/drF(k)
      ENDDO
      IF ( selectSigmaCoord .EQ. 0 ) THEN
       DO k=1,Nr+1
         aHybSigmF(k) = 0.d0
         bHybSigmF(k) = 0.d0
         dAHybSigC(k) = 0.d0
         dAHybSigC(k) = 0.d0
       ENDDO
       DO k=1,Nr
         aHybSigmC(k) = 0.d0
         bHybSigmC(k) = 0.d0
         dAHybSigF(k) = 0.d0
         dAHybSigF(k) = 0.d0
       ENDDO
      ELSE
       rFullDepth = rF(1) - rF(Nr+1)
       recip_fullDepth = 0.d0
       IF ( rFullDepth.GT.0. ) recip_fullDepth = 1.d0 / rFullDepth
       rSigBndRS = rSigmaBnd
       IF ( hybSigmFile.EQ.' ' .AND. rSigmaBnd.EQ.UNSET_RL ) THEN
         IF ( usingPCoords ) rSigBndRS = rF(Nr+1)
         IF ( usingZCoords ) rSigBndRS = rF(1)
       ENDIF
       IF ( hybSigmFile.EQ.' ' ) THEN
        IF ( usingPCoords .AND. setInterFDr ) THEN
         DO k=1,Nr+1
          tmpRS = MIN( rF(k), rSigBndRS )
          bHybSigmF(k) = ( rF(k) - tmpRS )/(rF(1)-rSigBndRS)
          aHybSigmF(k) = (1.d0 - bHybSigmF(k))
     &                  *( tmpRS -rF(Nr+1) )*recip_fullDepth
         ENDDO
        ENDIF
        IF ( usingPCoords .AND. setCenterDr ) THEN
         DO k=1,Nr
          tmpRS = MIN( rC(k), rSigBndRS )
          bHybSigmC(k) = ( rC(k) - tmpRS )/(rF(1)-rSigBndRS)
          aHybSigmC(k) = (1.d0 - bHybSigmC(k))
     &                  *( tmpRS -rF(Nr+1) )*recip_fullDepth
         ENDDO
        ENDIF
        IF ( usingZCoords .AND. setInterFDr ) THEN
         DO k=1,Nr+1
          tmpRS = MAX( rF(k), rSigBndRS )
          bHybSigmF(k) = ( rF(k)-rF(Nr+1) )/( tmpRS-rF(Nr+1) )
          aHybSigmF(k) = bHybSigmF(k)*( tmpRS-rF(1) )*recip_fullDepth
         ENDDO
        ENDIF
        IF ( usingZCoords .AND. setCenterDr ) THEN
         DO k=1,Nr
          tmpRS = MAX( rC(k), rSigBndRS )
          bHybSigmC(k) = ( rC(k)-rF(Nr+1) )/( tmpRS-rF(Nr+1) )
          aHybSigmC(k) = bHybSigmC(k)*( tmpRS-rF(1) )*recip_fullDepth
         ENDDO
        ENDIF
       ELSE
        IF (setCenterDr) THEN
         STOP 'ABNORMAL END: S/R INI_VERTICAL_GRID: Missing Code'
        ENDIF
       ENDIF
       IF ( .NOT.setInterFDr ) THEN
        bHybSigmF(1) = 1.d0
        aHybSigmF(1) = 0.d0
        bHybSigmF(Nr+1) = 0.d0
        aHybSigmF(Nr+1) = 0.d0
        DO k=2,Nr
          bHybSigmF(k) = ( bHybSigmC(k) + bHybSigmC(k-1) )*0.5d0
          aHybSigmF(k) = ( aHybSigmC(k) + aHybSigmC(k-1) )*0.5d0
        ENDDO
       ENDIF
       IF ( .NOT.setCenterDr ) THEN
        DO k=1,Nr
          bHybSigmC(k) = ( bHybSigmF(k) + bHybSigmF(k+1) )*0.5d0
          aHybSigmC(k) = ( aHybSigmF(k) + aHybSigmF(k+1) )*0.5d0
        ENDDO
       ENDIF
       DO k=1,Nr
         dAHybSigF(k) = ( aHybSigmF(k+1) - aHybSigmF(k) )*rkSign
         dBHybSigF(k) = ( bHybSigmF(k+1) - bHybSigmF(k) )*rkSign
       ENDDO
       DO k=2,Nr
         dAHybSigC(k) = ( aHybSigmC(k) - aHybSigmC(k-1) )*rkSign
         dBHybSigC(k) = ( bHybSigmC(k) - bHybSigmC(k-1) )*rkSign
       ENDDO
       dAHybSigC(1) = ( aHybSigmC(1) - aHybSigmF(1) )*rkSign
       dBHybSigC(1) = ( bHybSigmC(1) - bHybSigmF(1) )*rkSign
       dAHybSigC(Nr+1) = ( aHybSigmF(Nr+1) - aHybSigmC(Nr) )*rkSign
       dBHybSigC(Nr+1) = ( bHybSigmF(Nr+1) - bHybSigmC(Nr) )*rkSign
       maxErrC = 0.
       maxErrF = 0.
       epsil = 1.D-9
       DO k=1,Nr
         tmpError = ( rC(k)-rF(Nr+1) )*recip_fullDepth
     &            - ( aHybSigmC(k)+bHybSigmC(k) )
         IF ( ABS(tmpError).GT.epsil ) THEN
          IF ( maxErrC.LE.epsil ) THEN
           WRITE(msgBuf,'(2A)') 'S/R INI_VERTICAL_GRID:',
     &      ' rC and Hybrid-Sigma Coeff miss-match'
           CALL PRINT_ERROR( msgBuf, myThid )
          ENDIF
          WRITE(msgBuf,'(A,I4,2(A,1PE14.6),A,1P2E14.6)')
     &     ' k=', k,' , err=', tmpError, ' ; rC=', rC(k),
     &     ' , a & b=', aHybSigmC(k), bHybSigmC(k)
          CALL PRINT_ERROR( msgBuf, myThid )
         ENDIF
         maxErrC = MAX( maxErrC, ABS(tmpError) )
       ENDDO
       DO k=1,Nr+1
         tmpError = ( rF(k)-rF(Nr+1) )*recip_fullDepth
     &            - ( aHybSigmF(k)+bHybSigmF(k) )
         IF ( ABS(tmpError).GT.epsil ) THEN
          IF ( maxErrF.LE.epsil ) THEN
           WRITE(msgBuf,'(2A)') 'S/R INI_VERTICAL_GRID:',
     &      ' rF and Hybrid-Sigma Coeff miss-match'
           CALL PRINT_ERROR( msgBuf, myThid )
          ENDIF
          WRITE(msgBuf,'(A,I4,2(A,1PE14.6),A,1P2E14.6)')
     &     ' k=', k,' , err=', tmpError, ' ; rF=', rF(k),
     &     ' , a & b=', aHybSigmF(k), bHybSigmF(k)
          CALL PRINT_ERROR( msgBuf, myThid )
         ENDIF
         maxErrF = MAX( maxErrF, ABS(tmpError) )
       ENDDO
       WRITE(msgBuf,'(2A,1PE14.6)') 'S/R INI_VERTICAL_GRID:',
     &      ' matching of aHybSigmC & rC :', maxErrC
       CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                     SQUEEZE_RIGHT, myThid )
       WRITE(msgBuf,'(2A,1PE14.6)') 'S/R INI_VERTICAL_GRID:',
     &      ' matching of aHybSigmF & rF :', maxErrF
       CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                     SQUEEZE_RIGHT, myThid )
       IF ( maxErrC.GT.epsil .OR. maxErrF.GT.epsil ) THEN
         WRITE(msgBuf,'(2A)') 'S/R INI_VERTICAL_GRID:',
     &      ' rC,rF and Hybrid-Sigma Coeff miss-match'
         CALL PRINT_ERROR( msgBuf, myThid )
         STOP 'ABNORMAL END: S/R INI_VERTICAL_GRID'
       ENDIF
      ENDIF
      ENDIF
      CALL BARRIER(myThid)
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INITIALISE_VARIA( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      INTEGER bi,bj
      IF (debugMode) CALL DEBUG_ENTER('INITIALISE_VARIA',myThid)
      nIter0 = NINT( (startTime-baseTime)/deltaTClock )
      CALL INI_HFAC( myThid )
      CALL INI_DEPTHS( myThid )
      CALL INI_MASKS_ETC( myThid )
      IF (debugMode) CALL DEBUG_CALL('INI_LINEAR_PHISURF',myThid)
      CALL INI_LINEAR_PHISURF( myThid )
      IF (debugMode) CALL DEBUG_CALL('INI_CG2D',myThid)
      CALL INI_CG2D( myThid )
      IF (debugMode) CALL DEBUG_CALL('INI_DYNVARS',myThid)
      CALL INI_DYNVARS( myThid )
      IF (debugMode) CALL DEBUG_CALL('INI_FIELDS',myThid)
      CALL INI_FIELDS( myThid )
      IF (debugMode) CALL DEBUG_CALL('INI_MIXING',myThid)
      CALL INI_MIXING( myThid )
      IF (debugMode) CALL DEBUG_CALL('INI_FORCING',myThid)
      CALL INI_FORCING( myThid )
      CALL INI_AUTODIFF( myThid )
      IF (debugMode) CALL DEBUG_CALL('PACKAGES_INIT_VARIABLES',myThid)
      CALL PACKAGES_INIT_VARIABLES( myThid )
      IF ( startTime .EQ. baseTime .AND. cAdjFreq .NE. 0. ) THEN
      IF (debugMode) CALL DEBUG_CALL('CONVECTIVE_ADJUSTMENT_INI',myThid)
CADJ loop = parallel
        DO bj = myByLo(myThid), myByHi(myThid)
CADJ loop = parallel
         DO bi = myBxLo(myThid), myBxHi(myThid)
           CALL CONVECTIVE_ADJUSTMENT_INI(
     I                     bi, bj, startTime, nIter0, myThid )
         ENDDO
        ENDDO
      ENDIF
      IF (debugMode) CALL DEBUG_CALL('INTEGR_CONTINUITY',myThid)
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
        CALL INTEGR_CONTINUITY( bi, bj, uVel, vVel,
     I                          startTime, nIter0, myThid )
       ENDDO
      ENDDO
      IF ( exactConserv ) THEN
        IF (debugMode) CALL DEBUG_CALL('UPDATE_ETAH',myThid)
         CALL UPDATE_ETAH( startTime, nIter0, myThid )
      ENDIF
      CALL EXCH_XYZ_RL ( wVel, myThid )
      IF (debugMode) CALL DEBUG_CALL('STATE_SUMMARY',myThid)
      CALL STATE_SUMMARY( myThid )
      IF (debugMode) CALL DEBUG_CALL('MONITOR',myThid)
      CALL MONITOR( startTime, nIter0, myThid )
      IF (debugMode) CALL DEBUG_CALL('DO_STATEVARS_TAVE',myThid)
      CALL DO_STATEVARS_TAVE( startTime, nIter0, myThid )
      IF (debugMode) CALL DEBUG_CALL('DO_THE_MODEL_IO',myThid)
      CALL DO_THE_MODEL_IO( .FALSE., startTime, nIter0, myThid )
      IF (debugMode) CALL DEBUG_LEAVE('INITIALISE_VARIA',myThid)
      CALL BAR_CHECK( 4, myThid )
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INTEGRATE_FOR_W(
     I                     bi, bj, k, uFld, vFld, mFld,
     O                     wFld,
     I                     myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER bi,bj,k
      Real*8  uFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  mFld (1)
      Real*8  wFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      INTEGER i,j
      Real*8 uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 conv2d(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      DO j=1,sNy+1
        DO i=1,sNx+1
          uTrans(i,j) = uFld(i,j,k,bi,bj)
     &                *dyG(i,j,bi,bj)*deepFacC(k)*rhoFacC(k)
     &                *drF(k)*hFacW(i,j,k,bi,bj)
          vTrans(i,j) = vFld(i,j,k,bi,bj)
     &                *dxG(i,j,bi,bj)*deepFacC(k)*rhoFacC(k)
     &                *drF(k)*hFacS(i,j,k,bi,bj)
        ENDDO
      ENDDO
      DO j=1,sNy
        DO i=1,sNx
          conv2d(i,j) = -( uTrans(i+1,j)-uTrans(i,j)
     &                    +vTrans(i,j+1)-vTrans(i,j) )
        ENDDO
      ENDDO
      IF (rigidLid) THEN
        IF (k.EQ.1) THEN
          DO j=1,sNy
           DO i=1,sNx
             wFld(i,j,k,bi,bj) = 0.
           ENDDO
          ENDDO
        ELSEIF (k.EQ.Nr) THEN
          DO j=1,sNy
           DO i=1,sNx
             wFld(i,j,k,bi,bj) =
     &          conv2d(i,j)*recip_rA(i,j,bi,bj)
     &         *maskC(i,j,k,bi,bj)*maskC(i,j,k-1,bi,bj)
     &         *recip_deepFac2F(k)*recip_rhoFacF(k)
           ENDDO
          ENDDO
        ELSE
          DO j=1,sNy
           DO i=1,sNx
             wFld(i,j,k,bi,bj) =
     &        ( wFld(i,j,k+1,bi,bj)*deepFac2F(k+1)*rhoFacF(k+1)
     &         +conv2d(i,j)*recip_rA(i,j,bi,bj)
     &        )*maskC(i,j,k,bi,bj)*maskC(i,j,k-1,bi,bj)
     &         *recip_deepFac2F(k)*recip_rhoFacF(k)
           ENDDO
          ENDDO
        ENDIF
      ELSE
        IF (k.EQ.Nr) THEN
          DO j=1,sNy
           DO i=1,sNx
             wFld(i,j,k,bi,bj) =
     &          conv2d(i,j)*recip_rA(i,j,bi,bj)
     &         *maskC(i,j,k,bi,bj)
     &         *recip_deepFac2F(k)*recip_rhoFacF(k)
           ENDDO
          ENDDO
        ELSE
          DO j=1,sNy
           DO i=1,sNx
             wFld(i,j,k,bi,bj) =
     &        ( wFld(i,j,k+1,bi,bj)*deepFac2F(k+1)*rhoFacF(k+1)
     &         +conv2d(i,j)*recip_rA(i,j,bi,bj)
     &        )*maskC(i,j,k,bi,bj)
     &         *recip_deepFac2F(k)*recip_rhoFacF(k)
           ENDDO
          ENDDO
        ENDIF
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE INTEGR_CONTINUITY(
     I                             bi, bj, uFld, vFld,
     I                             myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      INTEGER bi,bj
      Real*8 uFld(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      Real*8 vFld(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      INTEGER k
      INTEGER i,j, ks
      Real*8 uTrans(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 vTrans(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 hDivFlow(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 facEmP, facMass
      Real*8 addMass(1)
      IF (exactConserv) THEN
       facEmP = 0.
       IF ( fluidIsWater.AND.useRealFreshWaterFlux ) facEmP=mass2rUnit
       facMass = 0.
       IF ( selectAddFluid.GE.1 ) facMass = mass2rUnit
       DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
         hDivFlow(i,j)      = 0.d0
         utrans(i,j)        = 0.d0
         vtrans(i,j)        = 0.d0
        ENDDO
       ENDDO
       DO k=1,Nr
        DO j=1,sNy+1
         DO i=1,sNx+1
          uTrans(i,j) = uFld(i,j,k,bi,bj)*dyG(i,j,bi,bj)
     &                 *deepFacC(k)*rhoFacC(k)
     &                 *drF(k)*hFacW(i,j,k,bi,bj)
          vTrans(i,j) = vFld(i,j,k,bi,bj)*dxG(i,j,bi,bj)
     &                 *deepFacC(k)*rhoFacC(k)
     &                 *drF(k)*hFacS(i,j,k,bi,bj)
         ENDDO
        ENDDO
        DO j=1,sNy
         DO i=1,sNx
           hDivFlow(i,j) = hDivFlow(i,j)
     &       +maskC(i,j,k,bi,bj)*( uTrans(i+1,j)-uTrans(i,j)
     &                            +vTrans(i,j+1)-vTrans(i,j) )
         ENDDO
        ENDDO
       ENDDO
       IF ( myTime.EQ.startTime .AND. myTime.NE.baseTime
     &       .AND. fluidIsWater .AND. useRealFreshWaterFlux ) THEN
         IF ( usePickupBeforeC54 ) THEN
          DO j=1,sNy
           DO i=1,sNx
            dEtaHdt(i,j,bi,bj) = (etaN(i,j,bi,bj)-etaH(i,j,bi,bj))
     &                         / (implicDiv2Dflow*deltaTfreesurf)
           ENDDO
          ENDDO
         ENDIF
         DO j=1,sNy
          DO i=1,sNx
            PmEpR(i,j,bi,bj) = dEtaHdt(i,j,bi,bj)
     &                       + hDivFlow(i,j)*recip_rA(i,j,bi,bj)
     &                                      *recip_deepFac2F(1)
            PmEpR(i,j,bi,bj) = PmEpR(i,j,bi,bj)*rUnit2mass
          ENDDO
         ENDDO
       ELSEIF ( myTime.EQ.startTime ) THEN
         DO j=1,sNy
          DO i=1,sNx
            ks = ksurfC(I,J,bi,bj)
            PmEpR(i,j,bi,bj) = 0.d0
            dEtaHdt(i,j,bi,bj) = -hDivFlow(i,j)*recip_rA(i,j,bi,bj)
     &                                         *recip_deepFac2F(ks)
          ENDDO
         ENDDO
       ELSE
         DO j=1-OLy,sNy+OLy
          DO i=1-OLx,sNx+OLx
            PmEpR(i,j,bi,bj) = -EmPmR(i,j,bi,bj)
          ENDDO
         ENDDO
         DO j=1,sNy
          DO i=1,sNx
            ks = ksurfC(i,j,bi,bj)
            dEtaHdt(i,j,bi,bj) = -hDivFlow(i,j)*recip_rA(i,j,bi,bj)
     &                                         *recip_deepFac2F(ks)
     &                           -facEmP*EmPmR(i,j,bi,bj)
          ENDDO
         ENDDO
       ENDIF
      ENDIF
      IF (exactConserv .AND. myTime.NE.startTime) THEN
       IF (implicDiv2Dflow.EQ. 0.d0) THEN
        DO j=1-Oly,sNy+Oly
         DO i=1-Olx,sNx+Olx
           etaN(i,j,bi,bj) = etaH(i,j,bi,bj)
         ENDDO
        ENDDO
       ELSE
        DO j=1,sNy
         DO i=1,sNx
           etaN(i,j,bi,bj) = etaH(i,j,bi,bj)
     &      + implicDiv2Dflow*dEtaHdt(i,j,bi,bj)*deltaTfreesurf
         ENDDO
        ENDDO
       ENDIF
      ENDIF
      DO k=Nr,1,-1
       CALL INTEGRATE_FOR_W(
     I                       bi, bj, k, uFld, vFld, addMass,
     O                       wVel,
     I                       myThid )
       IF ( k.EQ.Nr .AND. myTime.NE.baseTime .AND. usingPCoords
     &       .AND. fluidIsWater .AND. useRealFreshWaterFlux ) THEN
          DO j=1,sNy
           DO i=1,sNx
             wVel(i,j,k,bi,bj) = wVel(i,j,k,bi,bj)
     &               +mass2rUnit*PmEpR(i,j,bi,bj)*maskC(i,j,k,bi,bj)
           ENDDO
          ENDDO
       ENDIF
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE LOAD_FIELDS_DRIVER( myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
c
c
      common /ctrl_dummy/
     &                    xx_theta_dummy
     &                  , xx_salt_dummy
     &                  , xx_hflux_dummy
     &                  , xx_sflux_dummy
     &                  , xx_tauu_dummy
     &                  , xx_tauv_dummy
     &                  , xx_atemp_dummy
     &                  , xx_aqh_dummy
     &                  , xx_precip_dummy
     &                  , xx_swflux_dummy
     &                  , xx_swdown_dummy
     &                  , xx_snowprecip_dummy
     &                  , xx_lwflux_dummy
     &                  , xx_lwdown_dummy
     &                  , xx_evap_dummy
     &                  , xx_apressure_dummy
     &                  , xx_runoff_dummy
     &                  , xx_uwind_dummy
     &                  , xx_vwind_dummy
     &                  , xx_obcsn_dummy
     &                  , xx_obcss_dummy
     &                  , xx_obcsw_dummy
     &                  , xx_obcse_dummy
     &                  , xx_diffkr_dummy
     &                  , xx_kapgm_dummy
     &                  , xx_kapredi_dummy
     &                  , xx_tr1_dummy
     &                  , xx_sst_dummy
     &                  , xx_sss_dummy
     &                  , xx_depth_dummy
     &                  , xx_efluxy_dummy
     &                  , xx_efluxp_dummy
     &                  , xx_bottomdrag_dummy
     &                  , xx_edtaux_dummy
     &                  , xx_edtauy_dummy
     &                  , xx_uvel_dummy
     &                  , xx_vvel_dummy
     &                  , xx_etan_dummy
     &                  , xx_siarea_dummy
     &                  , xx_siheff_dummy
     &                  , xx_sihsnow_dummy
     &                  , xx_relaxsst_dummy
     &                  , xx_relaxsss_dummy
     &                  , xx_tbar_mean_dummy
     &                  , xx_tbar_daily_mean_dummy
     &                  , xx_sbar_mean_dummy
     &                  , xx_sbar_daily_mean_dummy
     &                  , xx_ubar_mean_dummy
     &                  , xx_vbar_mean_dummy
     &                  , xx_wbar_mean_dummy
     &                  , xx_psbar_mean_dummy
     &                  , xx_bpbar_mean_dummy
     &                  , xx_taux_mean_dummy
     &                  , xx_tauy_mean_dummy
     &                  , xx_hflux_mean_dummy
     &                  , xx_sflux_mean_dummy
     &                  , xx_sstbar_mean_dummy
     &                  , xx_sssbar_mean_dummy
     &                  , xx_atemp_mean_dummy
     &                  , xx_aqh_mean_dummy
     &                  , xx_precip_mean_dummy
     &                  , xx_swflux_mean_dummy
     &                  , xx_swdown_mean_dummy
     &                  , xx_snowprecip_mean_dummy
     &                  , xx_lwflux_mean_dummy
     &                  , xx_lwdown_mean_dummy
     &                  , xx_evap_mean_dummy
     &                  , xx_apressure_mean_dummy
     &                  , xx_runoff_mean_dummy
     &                  , xx_uwind_mean_dummy
     &                  , xx_vwind_mean_dummy
     &                  , xx_theta_ini_fin_dummy
     &                  , xx_salt_ini_fin_dummy
     &                  , xx_smrareabar_mean_dummy
     &                  , xx_smrsstbar_mean_dummy
     &                  , xx_smrsssbar_mean_dummy
     &                  , xx_gen2d_dummy
     &                  , xx_gen3d_dummy
cHFLUXM_CONTROL
     &                  , xx_hfluxm_dummy
cHFLUXM_CONTROL
      Real*8 xx_theta_dummy
      Real*8 xx_salt_dummy
      Real*8 xx_hflux_dummy
      Real*8 xx_sflux_dummy
      Real*8 xx_tauu_dummy
      Real*8 xx_tauv_dummy
      Real*8 xx_atemp_dummy
      Real*8 xx_aqh_dummy
      Real*8 xx_precip_dummy
      Real*8 xx_swflux_dummy
      Real*8 xx_swdown_dummy
      Real*8 xx_snowprecip_dummy
      Real*8 xx_lwflux_dummy
      Real*8 xx_lwdown_dummy
      Real*8 xx_evap_dummy
      Real*8 xx_apressure_dummy
      Real*8 xx_runoff_dummy
      Real*8 xx_uwind_dummy
      Real*8 xx_vwind_dummy
      Real*8 xx_obcsn_dummy
      Real*8 xx_obcss_dummy
      Real*8 xx_obcsw_dummy
      Real*8 xx_obcse_dummy
      Real*8 xx_diffkr_dummy
      Real*8 xx_kapgm_dummy
      Real*8 xx_kapredi_dummy
      Real*8 xx_tr1_dummy
      Real*8 xx_sst_dummy
      Real*8 xx_sss_dummy
      Real*8 xx_depth_dummy
      Real*8 xx_efluxy_dummy
      Real*8 xx_efluxp_dummy
      Real*8 xx_bottomdrag_dummy
      Real*8 xx_edtaux_dummy
      Real*8 xx_edtauy_dummy
      Real*8 xx_uvel_dummy
      Real*8 xx_vvel_dummy
      Real*8 xx_etan_dummy
      Real*8 xx_siarea_dummy
      Real*8 xx_siheff_dummy
      Real*8 xx_sihsnow_dummy
      Real*8 xx_relaxsst_dummy
      Real*8 xx_relaxsss_dummy
      Real*8 xx_gen2d_dummy
      Real*8 xx_gen3d_dummy
c
      Real*8 xx_tbar_mean_dummy
      Real*8 xx_tbar_daily_mean_dummy
      Real*8 xx_sbar_mean_dummy
      Real*8 xx_sbar_daily_mean_dummy
      Real*8 xx_ubar_mean_dummy
      Real*8 xx_vbar_mean_dummy
      Real*8 xx_wbar_mean_dummy
      Real*8 xx_psbar_mean_dummy
      Real*8 xx_bpbar_mean_dummy
      Real*8 xx_hflux_mean_dummy
      Real*8 xx_sflux_mean_dummy
      Real*8 xx_sstbar_mean_dummy
      Real*8 xx_sssbar_mean_dummy
      Real*8 xx_taux_mean_dummy
      Real*8 xx_tauy_mean_dummy
      Real*8 xx_atemp_mean_dummy
      Real*8 xx_aqh_mean_dummy
      Real*8 xx_precip_mean_dummy
      Real*8 xx_swflux_mean_dummy
      Real*8 xx_swdown_mean_dummy
      Real*8 xx_snowprecip_mean_dummy
      Real*8 xx_lwflux_mean_dummy
      Real*8 xx_lwdown_mean_dummy
      Real*8 xx_evap_mean_dummy
      Real*8 xx_apressure_mean_dummy
      Real*8 xx_runoff_mean_dummy
      Real*8 xx_uwind_mean_dummy
      Real*8 xx_vwind_mean_dummy
      Real*8 xx_theta_ini_fin_dummy
      Real*8 xx_salt_ini_fin_dummy
      Real*8 xx_smrareabar_mean_dummy
      Real*8 xx_smrsstbar_mean_dummy
      Real*8 xx_smrsssbar_mean_dummy
cHFLUXM_CONTROL
      Real*8 xx_hfluxm_dummy
cHFLUXM_CONTROL
c
c
c
c
c
      common /cost_r/
     &                fc
      Real*8  fc
      common /cost_objf/
     &                objf_atl,
     &                objf_test,
     &                objf_tracer,
     &                objf_entropy,
     &                objf_t_misfit,
     &                objf_eflux
cHFLUXM_CONTROL
     &               ,objf_hflux_tut
     &               ,objf_temp_tut
cHFLUXM_CONTROL
      Real*8  objf_atl  (nsx,nsy)
      Real*8  objf_test (nsx,nsy)
      Real*8  objf_tracer (nsx,nsy)
      Real*8  objf_entropy (nsx,nsy)
      Real*8  objf_t_misfit (nsx,nsy)
      Real*8  objf_eflux (nsx,nsy)
cHFLUXM_CONTROL
      Real*8  objf_hflux_tut (nsx,nsy)
      Real*8  objf_temp_tut (nsx,nsy)
cHFLUXM_CONTROL
      common /cost_param_r/
     &                lastinterval
      Real*8 lastinterval
      common /cost_aux_r/
     &                    mult_atl,
     &                    mult_test,
     &                    mult_tracer,
     &                    mult_entropy,
     &                    mult_t_misfit,
     &                    mult_eflux,
     &                    multTheta,
     &                    multSalt,
     &                    multUvel,
     &                    multVvel,
     &                    multEtan
cHFLUXM_CONTROL
     &                   ,mult_hflux_tut
     &                   ,mult_temp_tut
cHFLUXM_CONTROL
      Real*8  mult_atl
      Real*8  mult_test
      Real*8  mult_tracer
      Real*8  mult_entropy
      Real*8  mult_t_misfit
      Real*8  mult_eflux
      Real*8  multTheta
      Real*8  multSalt
      Real*8  multUvel
      Real*8  multVvel
      Real*8  multEtan
cHFLUXM_CONTROL
      Real*8  mult_hflux_tut
      Real*8  mult_temp_tut
cHFLUXM_CONTROL
      COMMON /COST_MEAN_R/
     &                     cMeanTheta, cMeanUVel, cMeanVVel,
     &                     cMeanThetaUVel, cMeanThetaVVel
      Real*8 cMeanTheta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 SItoBar, SItodBar
      PARAMETER ( SItoBar  = 1.D-05 )
      PARAMETER ( SItodBar = 1.D-04 )
      COMMON /PARM_EOS_LIN/ tAlpha,sBeta,equationOfState
      Real*8 tAlpha
      Real*8 sBeta
      character*(6) equationOfState
      COMMON /PARM_EOS_NL/ eosC,eosSig0,eosRefT,eosRefS
      Real*8 eosC(9,Nr+1),eosSig0(Nr+1),eosRefT(Nr+1),eosRefS(Nr+1)
      Real*8 eosJMDCFw(6), eosJMDCSw(9)
      Real*8 eosJMDCKFw(5), eosJMDCKSw(7), eosJMDCKP(14)
      COMMON /PARM_EOS_JMD95/
     &     eosJMDCFw, eosJMDCSw, eosJMDCKFw, eosJMDCKSw, eosJMDCKP
      Real*8 eosMDJWFnum(0:11), eosMDJWFden(0:12)
      COMMON /PARM_EOS_MDJWF/ 
     &     eosMDJWFnum, eosMDJWFden
      Real*8     myTime
      INTEGER myIter
      INTEGER myThid
      IF ( debugLevel .GE. debLevB )
     &     CALL DEBUG_ENTER( 'LOAD_FIELDS_DRIVER', myThid )
      IF ( .NOT.(useEXF.OR.useEBM) ) THEN
        IF ( debugLevel .GE. debLevB )
     &   CALL DEBUG_CALL('EXTERNAL_FIELDS_LOAD',myThid)
        CALL TIMER_START('EXTERNAL_FLDS_LOAD [LOAD_FLDS_DRIVER]',myThid)
        CALL EXTERNAL_FIELDS_LOAD( myTime, myIter, myThid )
        CALL TIMER_STOP ('EXTERNAL_FLDS_LOAD [LOAD_FLDS_DRIVER]',myThid)
      ENDIF
      IF ( debugLevel .GE. debLevB )
     &     CALL DEBUG_LEAVE( 'LOAD_FIELDS_DRIVER', myThid )
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE LOAD_GRID_SPACING( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      REAL*4 tmp4delX(Nx), tmp4delY(Ny), tmp4delR(Nr), tmp4delRc(Nr+1)
      REAL*8 tmp8delX(Nx), tmp8delY(Ny), tmp8delR(Nr), tmp8delRc(Nr+1)
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      INTEGER i, j, k, iLen, iUnit, rcLen1
      INTEGER  ILNBLNK
      EXTERNAL ILNBLNK
      IF (  myThid  .EQ. 1 ) THEN
      rcLen1 = 4
      IF (readBinaryPrec.EQ.precFloat64) rcLen1 = 4*2
      IF ( delXFile .NE. ' ' ) THEN
        CALL MDSFINDUNIT( iUnit, myThid )
        iLen = ILNBLNK(delXFile)
        IF (readBinaryPrec.EQ.precFloat32) THEN
         OPEN(iUnit, FILE=delXFile(1:iLen), STATUS='OLD',
     &        FORM='UNFORMATTED',ACCESS='DIRECT',RECL=rcLen1*Nx)
         READ(iUnit,rec=1) tmp4delX
         CLOSE(iUnit)
         DO i=1,Nx
           delX(i) = tmp4delX(i)
         ENDDO
        ELSEIF (readBinaryPrec.EQ.precFloat64) THEN
         OPEN(iUnit, FILE=delXFile(1:iLen), STATUS='OLD',
     &        FORM='UNFORMATTED',ACCESS='DIRECT',RECL=rcLen1*Nx)
         READ(iUnit,rec=1) tmp8delX
         CLOSE(iUnit)
         DO i=1,Nx
           delX(i) = tmp8delX(i)
         ENDDO
        ENDIF
        WRITE(msgBuf,'(3A)') 'S/R LOAD_GRID_SPACING:',
     &    ' delX loaded from file: ', delXFile(1:iLen)
        CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                      SQUEEZE_RIGHT , myThid )
      ENDIF
      IF ( delYFile .NE. ' ' ) THEN
        CALL MDSFINDUNIT( iUnit, myThid )
        iLen = ILNBLNK(delYFile)
        IF (readBinaryPrec.EQ.precFloat32) THEN
         OPEN(iUnit, FILE=delYFile(1:iLen), STATUS='OLD',
     &        FORM='UNFORMATTED',ACCESS='DIRECT',RECL=rcLen1*Ny)
         READ(iUnit,rec=1) tmp4delY
         CLOSE(iUnit)
         DO j=1,Ny
           delY(j) = tmp4delY(j)
         ENDDO
        ELSEIF (readBinaryPrec.EQ.precFloat64) THEN
         OPEN(iUnit, FILE=delYFile(1:iLen), STATUS='OLD',
     &        FORM='UNFORMATTED',ACCESS='DIRECT',RECL=rcLen1*Ny)
         READ(iUnit,rec=1) tmp8delY
         CLOSE(iUnit)
         DO j=1,Ny
           delY(j) = tmp8delY(j)
         ENDDO
        ENDIF
        WRITE(msgBuf,'(3A)') 'S/R LOAD_GRID_SPACING:',
     &    ' delY loaded from file: ', delYFile(1:iLen)
        CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                      SQUEEZE_RIGHT , myThid )
      ENDIF
      IF ( delRFile .NE. ' ' ) THEN
        CALL MDSFINDUNIT( iUnit, myThid )
        iLen = ILNBLNK(delRFile)
        IF (readBinaryPrec.EQ.precFloat32) THEN
         OPEN(iUnit, FILE=delRFile(1:iLen), STATUS='OLD',
     &        FORM='UNFORMATTED',ACCESS='DIRECT',RECL=rcLen1*Nr)
         READ(iUnit,rec=1) tmp4delR
         CLOSE(iUnit)
         DO k=1,Nr
           delR(k) = tmp4delR(k)
         ENDDO
        ELSEIF (readBinaryPrec.EQ.precFloat64) THEN
         OPEN(iUnit, FILE=delRFile(1:iLen), STATUS='OLD',
     &        FORM='UNFORMATTED',ACCESS='DIRECT',RECL=rcLen1*Nr)
         READ(iUnit,rec=1) tmp8delR
         CLOSE(iUnit)
         DO k=1,Nr
           delR(k) = tmp8delR(k)
         ENDDO
        ENDIF
        WRITE(msgBuf,'(3A)') 'S/R LOAD_GRID_SPACING:',
     &    ' delR loaded from file: ', delRFile(1:iLen)
        CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                      SQUEEZE_RIGHT , myThid )
      ENDIF
      IF ( delRcFile .NE. ' ' ) THEN
        CALL MDSFINDUNIT( iUnit, myThid )
        iLen = ILNBLNK(delRcFile)
        IF (readBinaryPrec.EQ.precFloat32) THEN
         OPEN(iUnit, FILE=delRcFile(1:iLen), STATUS='OLD',
     &        FORM='UNFORMATTED',ACCESS='DIRECT',RECL=rcLen1*(Nr+1))
         READ(iUnit,rec=1) tmp4delRc
         CLOSE(iUnit)
         DO k=1,Nr+1
           delRc(k) = tmp4delRc(k)
         ENDDO
        ELSEIF (readBinaryPrec.EQ.precFloat64) THEN
         OPEN(iUnit, FILE=delRcFile(1:iLen), STATUS='OLD',
     &        FORM='UNFORMATTED',ACCESS='DIRECT',RECL=rcLen1*(Nr+1))
         READ(iUnit,rec=1) tmp8delRc
         CLOSE(iUnit)
         DO k=1,Nr+1
           delRc(k) = tmp8delRc(k)
         ENDDO
        ENDIF
        WRITE(msgBuf,'(3A)') 'S/R LOAD_GRID_SPACING:',
     &    ' delRc loaded from file: ', delRcFile(1:iLen)
        CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                      SQUEEZE_RIGHT , myThid )
      ENDIF
      IF ( hybSigmFile .NE. ' ' ) THEN
        CALL MDSFINDUNIT( iUnit, myThid )
        iLen = ILNBLNK(hybSigmFile)
        IF (readBinaryPrec.EQ.precFloat32) THEN
         OPEN(iUnit, FILE=hybSigmFile(1:iLen), STATUS='OLD',
     &        FORM='UNFORMATTED',ACCESS='DIRECT',RECL=rcLen1*(Nr+1))
         READ(iUnit,rec=1) tmp4delRc
         DO k=1,Nr+1
           aHybSigmF(k) = tmp4delRc(k)
         ENDDO
         READ(iUnit,rec=2) tmp4delRc
         CLOSE(iUnit)
         DO k=1,Nr+1
           bHybSigmF(k) = tmp4delRc(k)
         ENDDO
        ELSEIF (readBinaryPrec.EQ.precFloat64) THEN
         OPEN(iUnit, FILE=hybSigmFile(1:iLen), STATUS='OLD',
     &        FORM='UNFORMATTED',ACCESS='DIRECT',RECL=rcLen1*(Nr+1))
         READ(iUnit,rec=1) tmp8delRc
         DO k=1,Nr+1
           aHybSigmF(k) = tmp8delRc(k)
         ENDDO
         READ(iUnit,rec=2) tmp8delRc
         CLOSE(iUnit)
         DO k=1,Nr+1
           bHybSigmF(k) = tmp8delRc(k)
         ENDDO
        ENDIF
        WRITE(msgBuf,'(3A)') 'S/R LOAD_GRID_SPACING:',
     &    ' a&b_HybSigmF loaded from file: ', hybSigmFile(1:iLen)
        CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                      SQUEEZE_RIGHT , myThid )
      ENDIF
      ENDIF
      CALL BARRIER(myThid)
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE MOMENTUM_CORRECTION_STEP(myTime, myIter, myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      Real*8 phiSurfX(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 phiSurfY(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER iMin,iMax
      INTEGER jMin,jMax
      INTEGER bi,bj
      INTEGER k,i,j
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
        DO j=1-OLy,sNy+OLy
         DO i=1-OLx,sNx+OLx
          phiSurfX(i,j)=0.
          phiSurfY(i,j)=0.
         ENDDO
        ENDDO
        iMin = 1-OLx+1
        iMax = sNx+OLx
        jMin = 1-OLy+1
        jMax = sNy+OLy
        CALL CALC_GRAD_PHI_SURF(
     I       bi,bj,iMin,iMax,jMin,jMax,
     I       etaN,
     O       phiSurfX,phiSurfY,
     I       myThid )
        DO K=1,Nr
          IF (momStepping)
     &      CALL CORRECTION_STEP(
     I         bi,bj,iMin,iMax,jMin,jMax,K,
     I         phiSurfX,phiSurfY,myTime,myThid )
        ENDDO
       ENDDO
      ENDDO
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
          act1 = bi - myBxLo(myThid)
          max1 = myBxHi(myThid) - myBxLo(myThid) + 1
          act2 = bj - myByLo(myThid)
          max2 = myByHi(myThid) - myByLo(myThid) + 1
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = ikey_dynamics - 1
          idynkey = (act1 + 1) + act2*max1
     &                      + act3*max1*max2
     &                      + act4*max1*max2*max3
        CALL INTEGR_CONTINUITY( bi, bj, uVel, vVel,
     I                          myTime, myIter, myThid )
       ENDDO
      ENDDO
      IF ( exactConserv .AND. implicDiv2Dflow .NE. 0.d0)
     & CALL EXCH_XY_RL (  etaN ,  myThid  )
      IF ( implicitIntGravWave ) 
     & CALL EXCH_XYZ_RL (  wVel ,  myThid  )
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE PACKAGES_INIT_VARIABLES( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      INTEGER myThid
      IF (debugMode)
     &     CALL DEBUG_ENTER('PACKAGES_INIT_VARIABLES',myThid)
      IF ( useGAD ) THEN
        IF (debugMode) CALL DEBUG_CALL('GAD_INIT_VARIA',myThid)
        CALL GAD_INIT_VARIA( myThid )
      ENDIF
      IF (useCDscheme) THEN
        IF (debugMode) CALL DEBUG_CALL('CD_CODE_INI_VARS',myThid)
        CALL CD_CODE_INI_VARS( myThid )
      ENDIF
      IF (useGMRedi) THEN
        IF (debugMode) CALL DEBUG_CALL('GMREDI_INIT',myThid)
        CALL GMREDI_INIT( myThid )
      ENDIF
CADJ STORE theta = tapelev_init, key = 1
      IF (debugMode) CALL DEBUG_CALL('CTRL_INIT_VARIABLES',myThid)
      CALL CTRL_INIT_VARIABLES ( myThid )
      IF (debugMode) CALL DEBUG_CALL('CTRL_MAP_INI',myThid)
      CALL CTRL_MAP_INI( myThid )
      CALL BARRIER(myThid)
      CALL COST_INIT_VARIA( myThid )
      CALL BARRIER(myThid)
C
      IF (debugMode)
     &     CALL DEBUG_LEAVE('PACKAGES_INIT_VARIABLES',myThid)
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE PRESSURE_FOR_EOS(
     I        bi, bj, iMin, iMax, jMin, jMax,  k,
     O        locPres,
     I        myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER bi, bj, k
      INTEGER iMin,iMax,jMin,jMax
      Real*8 locPres(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      INTEGER myThid
      INTEGER  i,j
C
C
      IF ( usingZCoords ) THEN
        IF ( useDynP_inEos_Zc ) THEN
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
            locPres(i,j) = rhoConst*(
     &                   totPhiHyd(i,j,k,bi,bj)
     &                  -rC(k)*gravity )
          ENDDO
         ENDDO
       ELSE
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
            locPres(i,j) = -rhoConst*rC(k)*gravity
          ENDDO
         ENDDO
       ENDIF
      ELSEIF ( usingPCoords ) THEN
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
            locPres(i,j) = rC(k)
          ENDDO
         ENDDO
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE READ_PICKUP(
     I                        myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
      INTEGER maxNoChkptLev
      PARAMETER ( maxNoChkptLev = 2 )
      COMMON / RESTART_I /
     &  nCheckLev,
     &  tempStartAB, saltStartAB,
     &  mom_StartAB, nHydStartAB,
     &  dPhiNHstatus
      INTEGER nCheckLev
      INTEGER tempStartAB
      INTEGER saltStartAB
      INTEGER mom_StartAB
      INTEGER nHydStartAB
      INTEGER dPhiNHstatus
      COMMON / RESTART_C /
     &  checkPtSuff
      CHARACTER*(5) checkPtSuff(maxNoChkptLev)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      INTEGER myIter
      INTEGER myThid
      INTEGER fp
      CHARACTER*(MAX_LEN_FNAM) fn
      CHARACTER*(10) suff
      INTEGER filePrec, nbFields
      INTEGER missFldDim, nMissing
      PARAMETER( missFldDim = 20 )
      CHARACTER*(8) missFldList(missFldDim)
      INTEGER j, nj, ioUnit
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      DO j = 1,MAX_LEN_FNAM
        fn(j:j) = ' '
      ENDDO
      IF (pickupSuff .EQ. ' ') THEN
        WRITE(suff,'(I10.10)') myIter
      ELSE
        WRITE(suff,'(A10)') pickupSuff
      ENDIF
      WRITE(fn,'(A,A10)') 'pickup.',suff
      IF (pickup_read_mdsio) THEN
       fp = precFloat64
       CALL READ_MFLDS_SET(
     I                      fn,
     O                      nbFields, filePrec,
     I                      Nr, myIter, myThid )
       IF (  myThid  .EQ. 1 ) THEN
       IF ( nbFields.GE.0 .AND. filePrec.NE.fp ) THEN
         WRITE(msgBuf,'(2A,I4)') 'READ_PICKUP: ',
     &    'pickup-file binary precision do not match !'
         CALL PRINT_ERROR( msgBuf, myThid )
         WRITE(msgBuf,'(A,2(A,I4))') 'READ_PICKUP: ',
     &    'file prec.=', filePrec, ' but expecting prec.=', fp
         CALL PRINT_ERROR( msgBuf, myThid )
         STOP 'ABNORMAL END: S/R READ_PICKUP (data-prec Pb)'
       ENDIF
       ENDIF
       IF ( nbFields.LE.0 ) THEN
        ioUnit = errorMessageUnit
        IF ( pickupStrictlyMatch ) THEN
          WRITE(msgBuf,'(4A)') 'READ_PICKUP: ',
     &      'no field-list found in meta-file',
     &      ' => cannot check for strick-matching'
          CALL PRINT_ERROR( msgBuf, myThid )
          WRITE(msgBuf,'(4A)') 'READ_PICKUP: ',
     &      'try with " pickupStrictlyMatch=.FALSE.,"',
     &      ' in file: "data", NameList: "PARM03"'
          CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
          STOP 'ABNORMAL END: S/R READ_PICKUP'
        ELSE
          WRITE(msgBuf,'(4A)') 'WARNING >> READ_PICKUP: ',
     &      ' no field-list found'
          CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
         IF ( nbFields.EQ.-1 ) THEN
          WRITE(msgBuf,'(4A)') 'WARNING >> ',
     &      ' try to read pickup as currently written'
          CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
         ELSE
          WRITE(msgBuf,'(4A)') 'WARNING >> ',
     &      ' try to read pickup as it used to be written'
          CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
          WRITE(msgBuf,'(4A)') 'WARNING >> ',
     &      ' until checkpoint59i (2007 Oct 22)'
          CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
         ENDIF
        ENDIF
       ENDIF
       IF ( nbFields.EQ.0 ) THEN
        IF ( usePickupBeforeC54 ) THEN
          CALL READ_REC_3D_RL( fn, fp, Nr, uVel,  1, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp, Nr, gU,    2, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp, Nr, guNm1, 3, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp, Nr, vVel,  4, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp, Nr, gV,    5, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp, Nr, gvNm1, 6, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp, Nr, theta, 7, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp, Nr, gT,    8, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp, Nr, gtNm1, 9, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp, Nr, salt, 10, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp, Nr, gS,   11, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp, Nr, gsNm1,12, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp,  1, etaN,
     &                                      12*Nr+1, myIter,myThid )
        ELSE
          CALL READ_REC_3D_RL( fn, fp, Nr, uVel,  1, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp, Nr, guNm1, 2, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp, Nr, vVel,  3, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp, Nr, gvNm1, 4, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp, Nr, theta, 5, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp, Nr, gtNm1, 6, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp, Nr, salt,  7, myIter,myThid )
          CALL READ_REC_3D_RL( fn, fp, Nr, gsNm1, 8, myIter,myThid )
          nj = 8
          CALL READ_REC_3D_RL( fn,fp,1, etaN, nj*Nr+1, myIter,myThid )
          IF ( exactConserv ) THEN
           CALL READ_REC_3D_RL(fn,fp,1,dEtaHdt,nj*Nr+2,myIter,myThid )
          ENDIF
          IF ( nonlinFreeSurf.GT.0 ) THEN
           CALL READ_REC_3D_RL(fn,fp,1, etaH, nj*Nr+3, myIter,myThid )
          ENDIF
        ENDIF
        IF ( useDynP_inEos_Zc ) THEN
          WRITE(fn,'(A,A10)') 'pickup_ph.',suff
          CALL READ_REC_3D_RL( fn, fp, Nr, totPhiHyd,1,myIter,myThid )
         ENDIF
       ELSE
          nj = 0
          CALL READ_MFLDS_3D_RL( 'Uvel    ', uVel,
     &                                     nj, fp, Nr, myIter, myThid )
          CALL READ_MFLDS_3D_RL( 'Vvel    ', vVel,
     &                                     nj, fp, Nr, myIter, myThid )
          CALL READ_MFLDS_3D_RL( 'Theta   ', theta,
     &                                     nj, fp, Nr, myIter, myThid )
          CALL READ_MFLDS_3D_RL( 'Salt    ', salt,
     &                                     nj, fp, Nr, myIter, myThid )
        IF ( momStepping ) THEN
          CALL READ_MFLDS_3D_RL( 'GuNm1   ', guNm1,
     &                                     nj, fp, Nr, myIter, myThid )
          CALL READ_MFLDS_3D_RL( 'GvNm1   ', gvNm1,
     &                                     nj, fp, Nr, myIter, myThid )
        ENDIF
        IF ( AdamsBashforthGt ) THEN
          CALL READ_MFLDS_3D_RL( 'GtNm1   ', gtNm1,
     &                                     nj, fp, Nr, myIter, myThid )
        ENDIF
        IF ( AdamsBashforthGs ) THEN
          CALL READ_MFLDS_3D_RL( 'GsNm1   ', gsNm1,
     &                                     nj, fp, Nr, myIter, myThid )
        ENDIF
        IF ( useDynP_inEos_Zc ) THEN
          CALL READ_MFLDS_3D_RL( 'PhiHyd  ', totPhiHyd,
     &                                     nj, fp, Nr, myIter, myThid )
        ENDIF
          nj = nj*Nr
          CALL READ_MFLDS_3D_RL( 'EtaN    ', etaN,
     &                                     nj, fp, 1 , myIter, myThid )
        IF ( exactConserv ) THEN
          CALL READ_MFLDS_3D_RL( 'dEtaHdt ', dEtaHdt,
     &                                     nj, fp, 1 , myIter, myThid )
        ENDIF
        IF ( nonlinFreeSurf.GT.0 ) THEN
          CALL READ_MFLDS_3D_RL( 'EtaH    ', etaH,
     &                                     nj, fp, 1 , myIter, myThid )
        ENDIF
       ENDIF
       nMissing = missFldDim
       CALL READ_MFLDS_CHECK(
     O                    missFldList,
     U                    nMissing,
     I                    myIter, myThid )
       IF ( nMissing.GT.missFldDim ) THEN
         WRITE(msgBuf,'(2A,I4)') 'READ_PICKUP: ',
     &     'missing fields list has been truncated to', missFldDim
         CALL PRINT_ERROR( msgBuf, myThid )
         STOP 'ABNORMAL END: S/R READ_PICKUP (list-size Pb)'
       ENDIF
       CALL CHECK_PICKUP(
     I                    missFldList,
     I                    nMissing, nbFields,
     I                    myIter, myThid )
      ENDIF
      CALL EXCH_UV_3D_RL( uVel, vVel, .TRUE., Nr, myThid )
      CALL EXCH_3D_RL( theta, Nr, myThid )
      CALL EXCH_3D_RL( salt,  Nr, myThid )
      CALL EXCH_UV_3D_RL( guNm1, gvNm1, .TRUE., Nr, myThid )
      CALL EXCH_3D_RL( gtNm1, Nr, myThid )
      CALL EXCH_3D_RL( gsNm1, Nr, myThid )
      CALL EXCH_XY_RL( etaN, myThid )
      CALL EXCH_XY_RL( etaH, myThid )
      CALL EXCH_XY_RL( detaHdt, myThid )
      IF ( useDynP_inEos_Zc )
     &  CALL EXCH_3D_RL( totPhiHyd, Nr, myThid )
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      subroutine rotate_uv2en_rl(
     U          uFldX, vFldY,
     U          uFldE, vFldN,
     I          xy2en, switchGrid, applyMask, kSize, mythid
     &                     )
c
c
      implicit none
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      integer kSize 
      logical xy2en, switchGrid, applyMask
      Real*8     uFldX(1-olx:snx+olx,1-oly:sny+oly,kSize,nsx,nsy)
      Real*8     vFldY(1-olx:snx+olx,1-oly:sny+oly,kSize,nsx,nsy)
      Real*8     uFldE(1-olx:snx+olx,1-oly:sny+oly,kSize,nsx,nsy)
      Real*8     vFldN(1-olx:snx+olx,1-oly:sny+oly,kSize,nsx,nsy)
      integer mythid
      integer bi,bj
      integer i,j,k,kk
      Real*8     tmpU(1-olx:snx+olx,1-oly:sny+oly)
      Real*8     tmpV(1-olx:snx+olx,1-oly:sny+oly)
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      if ( (kSize.NE.1).AND.(kSize.NE.nr)
     &   .AND.(applyMask) ) then
        WRITE(msgBuf,'(2A,I4,A)') ' ROTATE_UV2EN: ',
     &       'no mask has ',kSize,' levels'
        CALL PRINT_ERROR(msgBuf, myThid)      
        STOP 'ABNROMAL END: S/R ROTATE_UV2EN' 
      endif
      do bj = mybylo(mythid),mybyhi(mythid)
       do bi = mybxlo(mythid),mybxhi(mythid)
        do k = 1,kSize
        if ( (kSize.EQ.1).AND.(usingPCoords) ) then
          kk=nr
        else
          kk=k
        endif
        if ( xy2en ) then
        if ( switchGrid ) then
        do i = 1-olx,snx+olx
          tmpU(i,sny+Oly)=0.
          tmpV(i,sny+Oly)=0.
        enddo
        do j = 1-oly,sny+oly-1
          tmpU(snx+Olx,j)=0.
          tmpV(snx+Olx,j)=0.
        do i = 1-olx,snx+olx-1
          tmpU(i,j) = 0.5d0
     &          *( uFldX(i+1,j,k,bi,bj) + uFldX(i,j,k,bi,bj) )
          tmpV(i,j) = 0.5d0
     &          *( vFldY(i,j+1,k,bi,bj) + vFldY(i,j,k,bi,bj) )
          if (applyMask) then
            tmpU(i,j) = tmpU(i,j) * maskC(i,j,kk,bi,bj)
            tmpV(i,j) = tmpV(i,j) * maskC(i,j,kk,bi,bj)
          endif
          enddo
          enddo
        else
          do j = 1-oly,sny+oly
          do i = 1-olx,snx+olx
            tmpU(i,j) = uFldX(i,j,k,bi,bj)
            tmpV(i,j) = vFldY(i,j,k,bi,bj)
            if (applyMask) then
              tmpU(i,j) = tmpU(i,j) * maskC(i,j,kk,bi,bj)
              tmpV(i,j) = tmpV(i,j) * maskC(i,j,kk,bi,bj)
            endif
          enddo
          enddo
        endif!if ( switchGrid ) then
          do j = 1-oly,sny+oly
          do i = 1-olx,snx+olx
            uFldE(i,j,k,bi,bj) = 
     &         angleCosC(i,j,bi,bj)*tmpU(i,j)
     &        -angleSinC(i,j,bi,bj)*tmpV(i,j)
            vFldN(i,j,k,bi,bj) = 
     &         angleSinC(i,j,bi,bj)*tmpU(i,j)
     &        +angleCosC(i,j,bi,bj)*tmpV(i,j)
          enddo
          enddo
      else!if (xy2en) then
          do j = 1-oly,sny+oly
          do i = 1-olx,snx+olx
            tmpU(i,j) = 
     &         angleCosC(i,j,bi,bj)*uFldE(i,j,k,bi,bj)
     &        +angleSinC(i,j,bi,bj)*vFldN(i,j,k,bi,bj)
            tmpV(i,j) =
     &        -angleSinC(i,j,bi,bj)*uFldE(i,j,k,bi,bj)
     &        +angleCosC(i,j,bi,bj)*vFldN(i,j,k,bi,bj)
          enddo
          enddo
        if ( switchGrid ) then
          do i = 1-olx,snx+olx
            uFldX(i,1,k,bi,bj)=0.
            vFldY(i,1,k,bi,bj)=0.
          enddo
          do j = 1-oly+1,sny+oly
             uFldX(1,j,k,bi,bj)=0.
             vFldY(1,j,k,bi,bj)=0.
          do i = 1-olx+1,snx+olx
            uFldX(i,j,k,bi,bj) = 0.5d0
     &         *( tmpU(i-1,j) + tmpU(i,j) )
            vFldY(i,j,k,bi,bj) = 0.5d0
     &         *( tmpV(i,j-1) + tmpV(i,j) )
            if (applyMask) then
              uFldX(i,j,k,bi,bj)=uFldX(i,j,k,bi,bj)*maskW(i,j,kk,bi,bj)
              vFldY(i,j,k,bi,bj)=vFldY(i,j,k,bi,bj)*maskS(i,j,kk,bi,bj)
            endif
          enddo
          enddo
        else
          do j = 1-oly,sny+oly
          do i = 1-olx,snx+olx
            uFldX(i,j,k,bi,bj) = tmpU(i,j)
            vFldY(i,j,k,bi,bj) = tmpV(i,j)
            if (applyMask) then
              uFldX(i,j,k,bi,bj)=uFldX(i,j,k,bi,bj)*maskC(i,j,kk,bi,bj)
              vFldY(i,j,k,bi,bj)=vFldY(i,j,k,bi,bj)*maskC(i,j,kk,bi,bj)
            endif
          enddo
          enddo
        endif!if ( switchGrid ) then
        endif!if (xy2en) then
        enddo
       enddo
      enddo
      return
      end
      subroutine rotate_uv2en_rs(
     U          uFldX, vFldY,
     U          uFldE, vFldN,
     I          xy2en, switchGrid, applyMask, kSize, mythid
     &                     )
c
c
      implicit none
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      integer kSize 
      logical xy2en, switchGrid, applyMask
      Real*8     uFldX(1-olx:snx+olx,1-oly:sny+oly,kSize,nsx,nsy)
      Real*8     vFldY(1-olx:snx+olx,1-oly:sny+oly,kSize,nsx,nsy)
      Real*8     uFldE(1-olx:snx+olx,1-oly:sny+oly,kSize,nsx,nsy)
      Real*8     vFldN(1-olx:snx+olx,1-oly:sny+oly,kSize,nsx,nsy)
      integer mythid
      integer bi,bj
      integer i,j,k,kk
      Real*8     tmpU(1-olx:snx+olx,1-oly:sny+oly)
      Real*8     tmpV(1-olx:snx+olx,1-oly:sny+oly)
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      if ( (kSize.NE.1).AND.(kSize.NE.nr)
     &   .AND.(applyMask) ) then
        WRITE(msgBuf,'(2A,I4,A)') ' ROTATE_UV2EN: ',
     &       'no mask has ',kSize,' levels'
        CALL PRINT_ERROR(msgBuf, myThid)      
        STOP 'ABNROMAL END: S/R ROTATE_UV2EN' 
      endif
      do bj = mybylo(mythid),mybyhi(mythid)
       do bi = mybxlo(mythid),mybxhi(mythid)
        do k = 1,kSize
        if ( (kSize.EQ.1).AND.(usingPCoords) ) then
          kk=nr
        else
          kk=k
        endif
        if ( xy2en ) then
        if ( switchGrid ) then
        do i = 1-olx,snx+olx
          tmpU(i,sny+Oly)=0.
          tmpV(i,sny+Oly)=0.
        enddo
        do j = 1-oly,sny+oly-1
          tmpU(snx+Olx,j)=0.
          tmpV(snx+Olx,j)=0.
        do i = 1-olx,snx+olx-1
          tmpU(i,j) = 0.5d0
     &          *( uFldX(i+1,j,k,bi,bj) + uFldX(i,j,k,bi,bj) )
          tmpV(i,j) = 0.5d0
     &          *( vFldY(i,j+1,k,bi,bj) + vFldY(i,j,k,bi,bj) )
          if (applyMask) then
            tmpU(i,j) = tmpU(i,j) * maskC(i,j,kk,bi,bj)
            tmpV(i,j) = tmpV(i,j) * maskC(i,j,kk,bi,bj)
          endif
          enddo
          enddo
        else
          do j = 1-oly,sny+oly
          do i = 1-olx,snx+olx
            tmpU(i,j) = uFldX(i,j,k,bi,bj)
            tmpV(i,j) = vFldY(i,j,k,bi,bj)
            if (applyMask) then
              tmpU(i,j) = tmpU(i,j) * maskC(i,j,kk,bi,bj)
              tmpV(i,j) = tmpV(i,j) * maskC(i,j,kk,bi,bj)
            endif
          enddo
          enddo
        endif!if ( switchGrid ) then
          do j = 1-oly,sny+oly
          do i = 1-olx,snx+olx
            uFldE(i,j,k,bi,bj) = 
     &         angleCosC(i,j,bi,bj)*tmpU(i,j)
     &        -angleSinC(i,j,bi,bj)*tmpV(i,j)
            vFldN(i,j,k,bi,bj) = 
     &         angleSinC(i,j,bi,bj)*tmpU(i,j)
     &        +angleCosC(i,j,bi,bj)*tmpV(i,j)
          enddo
          enddo
      else!if (xy2en) then
          do j = 1-oly,sny+oly
          do i = 1-olx,snx+olx
            tmpU(i,j) = 
     &         angleCosC(i,j,bi,bj)*uFldE(i,j,k,bi,bj)
     &        +angleSinC(i,j,bi,bj)*vFldN(i,j,k,bi,bj)
            tmpV(i,j) =
     &        -angleSinC(i,j,bi,bj)*uFldE(i,j,k,bi,bj)
     &        +angleCosC(i,j,bi,bj)*vFldN(i,j,k,bi,bj)
          enddo
          enddo
        if ( switchGrid ) then
          do i = 1-olx,snx+olx
            uFldX(i,1,k,bi,bj)=0.
            vFldY(i,1,k,bi,bj)=0.
          enddo
          do j = 1-oly+1,sny+oly
             uFldX(1,j,k,bi,bj)=0.
             vFldY(1,j,k,bi,bj)=0.
          do i = 1-olx+1,snx+olx
            uFldX(i,j,k,bi,bj) = 0.5d0
     &         *( tmpU(i-1,j) + tmpU(i,j) )
            vFldY(i,j,k,bi,bj) = 0.5d0
     &         *( tmpV(i,j-1) + tmpV(i,j) )
            if (applyMask) then
              uFldX(i,j,k,bi,bj)=uFldX(i,j,k,bi,bj)*maskW(i,j,kk,bi,bj)
              vFldY(i,j,k,bi,bj)=vFldY(i,j,k,bi,bj)*maskS(i,j,kk,bi,bj)
            endif
          enddo
          enddo
        else
          do j = 1-oly,sny+oly
          do i = 1-olx,snx+olx
            uFldX(i,j,k,bi,bj) = tmpU(i,j)
            vFldY(i,j,k,bi,bj) = tmpV(i,j)
            if (applyMask) then
              uFldX(i,j,k,bi,bj)=uFldX(i,j,k,bi,bj)*maskC(i,j,kk,bi,bj)
              vFldY(i,j,k,bi,bj)=vFldY(i,j,k,bi,bj)*maskC(i,j,kk,bi,bj)
            endif
          enddo
          enddo
        endif!if ( switchGrid ) then
        endif!if (xy2en) then
        enddo
       enddo
      enddo
      return
      end
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      Real*8 FUNCTION SW_PTMP  (S,T,P,PR)
C
C
      IMPLICIT NONE
      Real*8 S,T,P,PR
      Real*8 sw_adtg
      EXTERNAL sw_adtg
      Real*8 del_P ,del_th, th, q
      Real*8 onehalf, two, three
      PARAMETER ( onehalf = 0.5d0, two = 2.d0, three = 3.d0 )
      del_P  = PR - P
      del_th = del_P*sw_adtg(S,T,P)
      th     = T + onehalf*del_th
      q      = del_th
      del_th = del_P*sw_adtg(S,th,P+onehalf*del_P)
      th     = th + (1 - 1/sqrt(two))*(del_th - q)
      q      = (two-sqrt(two))*del_th + (-two+three/sqrt(two))*q
      del_th = del_P*sw_adtg(S,th,P+onehalf*del_P)
      th     = th + (1 + 1/sqrt(two))*(del_th - q)
      q      = (two + sqrt(two))*del_th + (-two-three/sqrt(two))*q
      del_th = del_P*sw_adtg(S,th,P+del_P)
      SW_PTMP     = th + (del_th - two*q)/(two*three)
      RETURN
      END
      Real*8 FUNCTION SW_TEMP( S, T, P, PR )
C
C
      IMPLICIT NONE
      Real*8  S, T, P, PR
      Real*8 sw_adtg
      EXTERNAL sw_adtg
      Real*8 del_P ,del_th, th, q
      Real*8 onehalf, two, three
      PARAMETER ( onehalf = 0.5d0, two = 2.d0, three = 3.d0 )
      del_P  = P - PR ! to get in-situ from potential temperature
      del_th = del_P*sw_adtg(S,T,P)
      th     = T + onehalf*del_th
      q      = del_th
      del_th = del_P*sw_adtg(S,th,P+onehalf*del_P)
      th     = th + (1 - 1/sqrt(two))*(del_th - q)
      q      = (two-sqrt(two))*del_th + (-two+three/sqrt(two))*q
      del_th = del_P*sw_adtg(S,th,P+onehalf*del_P)
      th     = th + (1 + 1/sqrt(two))*(del_th - q)
      q      = (two + sqrt(two))*del_th + (-two-three/sqrt(two))*q
      del_th = del_P*sw_adtg(S,th,P+del_P)
      SW_temp= th + (del_th - two*q)/(two*three)
      RETURN
      END
      Real*8 FUNCTION SW_ADTG  (S,T,P)
C
      IMPLICIT NONE
      Real*8 S,T,P
      Real*8 a0,a1,a2,a3,b0,b1,c0,c1,c2,c3,d0,d1,e0,e1,e2
      Real*8 sref
      sref = 35.d0
      a0 =  3.5803D-5
      a1 = +8.5258D-6
      a2 = -6.836D-8
      a3 =  6.6228D-10
      b0 = +1.8932D-6
      b1 = -4.2393D-8
      c0 = +1.8741D-8
      c1 = -6.7795D-10
      c2 = +8.733D-12
      c3 = -5.4481D-14
      d0 = -1.1351D-10
      d1 =  2.7759D-12
      e0 = -4.6206D-13
      e1 = +1.8676D-14
      e2 = -2.1687D-16
      SW_ADTG =      a0 + (a1 + (a2 + a3*T)*T)*T
     &     + (b0 + b1*T)*(S-sref)
     &     + ( (c0 + (c1 + (c2 + c3*T)*T)*T) + (d0 + d1*T)*(S-sref) )*P
     &     + (  e0 + (e1 + e2*T)*T )*P*P
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE SOLVE_FOR_PRESSURE( myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
      Real*8 cg2d_x(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 cg2d_b(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_CD/
     &                   uVelD, vVelD,
     &                   etaNm1,
     &                   uNM1,  vNM1
      Real*8  uVelD (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVelD (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  etaNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uNM1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vNM1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      LOGICAL  DIFFERENT_MULTIPLE
      EXTERNAL DIFFERENT_MULTIPLE
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      INTEGER i,j,k,bi,bj
      INTEGER ks
      INTEGER numIters
      Real*8 firstResidual,lastResidual
      Real*8 tmpFac
      Real*8 sumEmP, tileEmP(nSx,nSy)
      LOGICAL putPmEinXvector
      INTEGER ioUnit
      CHARACTER*10 sufx
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      Real*8     cg3d_b(1)
        cg3d_b(1) = 0.
      putPmEinXvector = .FALSE.
      IF ( myIter.EQ.1+nIter0 .AND. debugLevel .GE. debLevA ) THEN
        IF (  myThid  .EQ. 1 ) THEN
        ioUnit = standardMessageUnit
        WRITE(msgBuf,'(2A,L5)') 'SOLVE_FOR_PRESSURE:',
     &       ' putPmEinXvector =', putPmEinXvector
        CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
        ENDIF
      ENDIF
      sumEmP = 0.
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
        DO j=1-OLy,sNy+OLy
         DO i=1-OLx,sNx+OLx
          etaNm1(i,j,bi,bj) = etaN(i,j,bi,bj)
          cg2d_x(i,j,bi,bj) = Bo_surf(i,j,bi,bj)*etaN(i,j,bi,bj)
          cg2d_b(i,j,bi,bj) = 0.
         ENDDO
        ENDDO
        IF (useRealFreshWaterFlux.AND.fluidIsWater) THEN
         tmpFac = freeSurfFac*mass2rUnit
         IF (exactConserv)
     &        tmpFac = freeSurfFac*mass2rUnit*implicDiv2DFlow
         DO j=1,sNy
          DO i=1,sNx
           cg2d_b(i,j,bi,bj) =
     &       tmpFac*rA(i,j,bi,bj)*EmPmR(i,j,bi,bj)/deltaTMom
          ENDDO
         ENDDO
        ENDIF
        IF ( putPmEinXvector ) THEN
         tileEmP(bi,bj) = 0.
         DO j=1,sNy
          DO i=1,sNx
            tileEmP(bi,bj) = tileEmP(bi,bj)
     &                     + rA(i,j,bi,bj)*EmPmR(i,j,bi,bj)
     &                                    *maskInC(i,j,bi,bj)
          ENDDO
         ENDDO
        ENDIF
       ENDDO
      ENDDO
      IF ( putPmEinXvector ) THEN
        CALL GLOBAL_SUM_TILE_RL( tileEmP, sumEmP, myThid )
      ENDIF
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
        IF ( putPmEinXvector ) THEN
          tmpFac = 0.
          IF (globalArea.GT.0.) tmpFac =
     &      freeSurfFac*deltaTfreesurf*mass2rUnit*sumEmP/globalArea
          DO j=1,sNy
           DO i=1,sNx
            cg2d_x(i,j,bi,bj) = cg2d_x(i,j,bi,bj)
     &                        - tmpFac*Bo_surf(i,j,bi,bj)
           ENDDO
          ENDDO
        ENDIF
        DO k=Nr,1,-1
         CALL CALC_DIV_GHAT(
     I                       bi,bj,k,
     U                       cg2d_b, cg3d_b,
     I                       myThid )
        ENDDO
       ENDDO
      ENDDO
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
        IF ( exactConserv ) THEN
         DO j=1,sNy
          DO i=1,sNx
           ks = ksurfC(i,j,bi,bj)
           cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj)
     &       -freeSurfFac*rA(i,j,bi,bj)*deepFac2F(ks)
     &         /deltaTMom/deltaTfreesurf
     &         * etaH(i,j,bi,bj)
          ENDDO
         ENDDO
        ELSE
         DO j=1,sNy
          DO i=1,sNx
           ks = ksurfC(i,j,bi,bj)
           cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj)
     &       -freeSurfFac*rA(i,j,bi,bj)*deepFac2F(ks)
     &         /deltaTMom/deltaTfreesurf
     &         * etaN(i,j,bi,bj)
          ENDDO
         ENDDO
        ENDIF
       ENDDO
      ENDDO
      IF ( debugLevel .GE. debLevB ) THEN
       CALL DEBUG_STATS_RL(1,cg2d_b,'cg2d_b (SOLVE_FOR_PRESSURE)',
     &                        myThid)
      ENDIF
      IF ( DIFFERENT_MULTIPLE(diagFreq, myTime, deltaTClock) ) THEN
       WRITE(sufx,'(I10.10)') myIter
       CALL WRITE_FLD_XY_RL( 'cg2d_b.', sufx, cg2d_b, myIter, myThid )
      ENDIF
      firstResidual=0.
      lastResidual=0.
      numIters=cg2dMaxIters
      IF (.TRUE.) THEN
       CALL CG2D(
     U           cg2d_b,
     U           cg2d_x,
     O           firstResidual,
     O           lastResidual,
     U           numIters,
     I           myThid )
      ENDIF
      CALL EXCH_XY_RL (  cg2d_x,  myThid  )
      IF ( debugLevel .GE. debLevB ) THEN
       CALL DEBUG_STATS_RL(1,cg2d_x,'cg2d_x (SOLVE_FOR_PRESSURE)',
     &                        myThid)
      ENDIF
      IF ( DIFFERENT_MULTIPLE(monitorFreq,myTime,deltaTClock)
     &   ) THEN
       IF ( debugLevel .GE. debLevA ) THEN
        IF (  myThid  .EQ. 1 ) THEN
        WRITE(msgBuf,'(A34,1PE24.14)') 'cg2d_init_res =',firstResidual
        CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
        WRITE(msgBuf,'(A34,I6)') 'cg2d_iters =',numIters
        CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
        WRITE(msgBuf,'(A34,1PE24.14)') 'cg2d_res =',lastResidual
        CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
        ENDIF
       ENDIF
      ENDIF
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
        DO j=1-OLy,sNy+OLy
         DO i=1-OLx,sNx+OLx
          etaN(i,j,bi,bj) = recip_Bo(i,j,bi,bj)*cg2d_x(i,j,bi,bj)
         ENDDO
        ENDDO
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE STATE_SUMMARY( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      IF ( myThid .EQ. 1 ) THEN
      WRITE(msgBuf,'(A)')
     &'// ======================================================='
      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, 
     &                    SQUEEZE_RIGHT , myThid )
      WRITE(msgBuf,'(A)') '// Model current state'
      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, 
     &                    SQUEEZE_RIGHT , myThid )
      WRITE(msgBuf,'(A)')
     &'// ======================================================='
      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                    SQUEEZE_RIGHT , myThid )
      WRITE(msgBuf,'(A)') ' '
      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                    SQUEEZE_RIGHT , myThid )
      ENDIF
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE SOLVE_PENTADIAGONAL( 
     I                     iMin,iMax, jMin,jMax,
     U                     a5d, b5d, c5d, d5d, e5d,
     U                     y5d,
     O                     errCode,
     I                     bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER iMin,iMax,jMin,jMax
      Real*8 a5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 b5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 c5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 d5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 e5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 y5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      INTEGER errCode
      INTEGER bi, bj, myThid
      INTEGER i,j,k
      Real*8 y5d_m1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 a5d_prime(Nr), b5d_prime(Nr)
      Real*8 c5d_prime(Nr), d5d_prime(Nr), e5d_prime(Nr)
      Real*8 y5d_prime(Nr), y5d_update(Nr), tmpval
      errCode = 0
      DO j=jMin,jMax
      DO i=iMin,iMax
      DO k=1,Nr
         y5d_m1(i,j,k) = y5d(i,j,k,bi,bj)
      ENDDO
      ENDDO
      ENDDO
      DO j=jMin,jMax
      DO i=iMin,iMax
      DO k=1,Nr
        a5d_prime(k) = 0.d0
        b5d_prime(k) = 0.d0
        c5d_prime(k) = 0.d0
        d5d_prime(k) = 0.d0
        e5d_prime(k) = 0.d0
        y5d_prime(k) = 0.d0
        y5d_update(k) = 0.d0
      ENDDO
      DO k=1,Nr
          IF (k.EQ.1) THEN
           a5d_prime(k) = 0.d0
           b5d_prime(k) = 0.d0
           c5d_prime(k) = c5d(i,j,k)
           d5d_prime(k) = d5d(i,j,k)
           e5d_prime(k) = e5d(i,j,k)
           y5d_prime(k) = y5d_m1(i,j,k)
          ELSEIF (k.EQ.2) THEN
           a5d_prime(k) = 0.d0
           b5d_prime(k) = 0.d0
           c5d_prime(k) = c5d(i,j,k)
     &      -b5d(i,j,k)*d5d_prime(k-1)
           d5d_prime(k) = d5d(i,j,k)
     &      -b5d(i,j,k)*e5d_prime(k-1)
           e5d_prime(k) = e5d(i,j,k)
           y5d_prime(k) = y5d_m1(i,j,k)
     &      -b5d(i,j,k)*y5d_prime(k-1)
          ELSE
           a5d_prime(k) = 0.d0
           b5d_prime(k) = 0.d0
           c5d_prime(k) = c5d(i,j,k)
     &      -a5d(i,j,k)*e5d_prime(k-2)
     &      -(b5d(i,j,k)-a5d(i,j,k)*d5d_prime(k-2))*d5d_prime(k-1)
           d5d_prime(k) = d5d(i,j,k)
     &      -(b5d(i,j,k)-a5d(i,j,k)*d5d_prime(k-2))*e5d_prime(k-1)
           e5d_prime(k) = e5d(i,j,k)
           y5d_prime(k) = y5d_m1(i,j,k)
     &      -a5d(i,j,k)*y5d_prime(k-2)
     &      -(b5d(i,j,k)-a5d(i,j,k)*d5d_prime(k-2))*y5d_prime(k-1)
          ENDIF
          tmpval=c5d_prime(k)
          IF ( tmpval.NE.0.d0 ) THEN
           a5d_prime(k) = a5d_prime(k) / tmpval
           b5d_prime(k) = b5d_prime(k) / tmpval
           c5d_prime(k) = 1.d0
           d5d_prime(k) = d5d_prime(k) / tmpval
           e5d_prime(k) = e5d_prime(k) / tmpval
           y5d_prime(k) = y5d_prime(k) / tmpval
          ELSE
           a5d_prime(k) = 0.d0
           b5d_prime(k) = 0.d0
           c5d_prime(k) = 0.d0
           d5d_prime(k) = 0.d0
           e5d_prime(k) = 0.d0
           y5d_prime(k) = 0.d0
           errCode = 1
          ENDIF
      ENDDO
      DO k=Nr,1,-1
       IF (k.EQ.Nr) THEN
          y5d_update(k) =   y5d_prime(k)
       ELSEIF (k.EQ.Nr-1) THEN
          y5d_update(k) =   y5d_prime(k)
     &     - y5d_update(k+1)*d5d_prime(k)
       ELSE
          y5d_update(k) =   y5d_prime(k)
     &     - y5d_update(k+1)*d5d_prime(k)
     &     - y5d_update(k+2)*e5d_prime(k)
       ENDIF
      ENDDO
      DO k=1,Nr
         y5d(i,j,k,bi,bj)=y5d_update(k)
      ENDDO
      ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE SOLVE_TRIDIAGONAL( 
     I                     iMin,iMax, jMin,jMax,
     I                     a3d, b3d, c3d,
     U                     y3d,
     O                     errCode,
     I                     bi, bj, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
      INTEGER iMin,iMax,jMin,jMax
      Real*8 a3d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 b3d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 c3d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 y3d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
      INTEGER errCode
      INTEGER bi, bj, myThid
      INTEGER i,j,k
      Real*8 tmpvar
      Real*8 c3d_prime(Nr), y3d_prime(Nr),y3d_update(Nr)
      Real*8 c3d_m1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      Real*8 y3d_m1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      errCode = 0
      DO j=jMin,jMax
      DO i=iMin,iMax
      DO k=1,Nr
         c3d_m1(i,j,k) = c3d(i,j,k)
         y3d_m1(i,j,k) = y3d(i,j,k,bi,bj)
      ENDDO
      ENDDO
      ENDDO
      DO j=jMin,jMax
      DO i=iMin,iMax
      DO k=1,Nr
        c3d_prime(k) = 0.d0
        y3d_prime(k) = 0.d0
        y3d_update(k) = 0.d0
      ENDDO
      DO k=1,Nr
         IF ( k.EQ.1 ) THEN
           IF ( b3d(i,j,1).NE.0.d0 ) THEN
             c3d_prime(1) = c3d_m1(i,j,1) / b3d(i,j,1)
             y3d_prime(1) = y3d_m1(i,j,1) / b3d(i,j,1)
           ELSE
             c3d_prime(1) = 0.d0
             y3d_prime(1) = 0.d0
             errCode = 1
           ENDIF
         ELSE
           tmpvar = b3d(i,j,k) - a3d(i,j,k)*c3d_prime(k-1)
           IF ( tmpvar .NE. 0.d0 ) THEN
             c3d_prime(k) = c3d_m1(i,j,k) / tmpvar
             y3d_prime(k) = (y3d_m1(i,j,k) - y3d_prime(k-1)*a3d(i,j,k))
     &                      / tmpvar
           ELSE
             c3d_prime(k) = 0.d0
             y3d_prime(k) = 0.d0
             errCode = 1
           ENDIF
         ENDIF
      ENDDO
      DO k=Nr,1,-1
         IF ( k.EQ.Nr ) THEN
          y3d_update(k)=y3d_prime(k)
         ELSE
          y3d_update(k)=y3d_prime(k)-c3d_prime(k)*y3d_update(k+1)
         ENDIF
      ENDDO
      DO k=1,Nr
         y3d(i,j,k,bi,bj)=y3d_update(k)
      ENDDO
      ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
 
      SUBROUTINE TAUEDDY_EXTERNAL_FORCING_U(
     I           iMin, iMax, jMin, jMax,bi,bj,kLev,
     I           myCurrentTime,myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 op5
      Real*8 op25
      PARAMETER( op5  = 0.5 D 0 )
      PARAMETER( op25 = 0.25 D 0 )
      LOGICAL GM_AdvForm
      LOGICAL GM_AdvSeparate
      LOGICAL GM_ExtraDiag
      LOGICAL GM_InMomAsStress
      LOGICAL GM_MNC
      LOGICAL GM_MDSIO
      COMMON /GM_PARAMS_L/
     &                   GM_AdvForm, GM_AdvSeparate,
     &                   GM_ExtraDiag, GM_MNC, GM_MDSIO,
     &                   GM_InMomAsStress
      CHARACTER*(40) GM_taper_scheme
      COMMON /GM_PARAMS_C/
     &                   GM_taper_scheme
      Real*8 GM_isopycK
      Real*8 GM_background_K
      Real*8 GM_maxSlope
      Real*8 GM_Kmin_horiz
      Real*8 GM_Small_Number
      Real*8 GM_slopeSqCutoff
      Real*8 GM_Visbeck_alpha
      Real*8 GM_Visbeck_length
      Real*8 GM_Visbeck_depth
      Real*8 GM_Visbeck_minDepth
      Real*8 GM_Visbeck_maxSlope
      Real*8 GM_Visbeck_minVal_K
      Real*8 GM_Visbeck_maxVal_K
      Real*8 GM_facTrL2dz
      Real*8 GM_facTrL2ML
      Real*8 GM_maxTransLay
      Real*8 GM_Scrit
      Real*8 GM_Sd
      COMMON /GM_PARAMS_R/
     &                   GM_isopycK, GM_background_K,
     &                   GM_maxSlope,
     &                   GM_Kmin_horiz,
     &                   GM_Small_Number, GM_slopeSqCutoff,
     &                   GM_Visbeck_alpha, GM_Visbeck_length,
     &                   GM_Visbeck_depth,
     &                   GM_Visbeck_minDepth, GM_Visbeck_maxSlope,
     &                   GM_Visbeck_minVal_K, GM_Visbeck_maxVal_K,
     &                   GM_facTrL2dz, GM_facTrL2ML, GM_maxTransLay,
     &                   GM_Scrit, GM_Sd
      Real*8 GM_rMaxSlope
      Real*8 GM_skewflx
      Real*8 GM_advect
      COMMON /GM_DERIVED_PAR/
     &                   GM_rMaxSlope,
     &                   GM_skewflx, GM_advect
      Real*8 Kwx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_Wtensor/ Kwx,Kwy,Kwz
      Real*8 Kux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_HorTensor/ Kux,Kvy
      Real*8 Kuz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_UVtensor/ Kuz,Kvz
      INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
      Real*8 myCurrentTime
      INTEGER myThid
      RETURN
      END
      SUBROUTINE TAUEDDY_EXTERNAL_FORCING_V(
     I           iMin, iMax, jMin, jMax,bi,bj,kLev,
     I           myCurrentTime,myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 op5
      Real*8 op25
      PARAMETER( op5  = 0.5 D 0 )
      PARAMETER( op25 = 0.25 D 0 )
      LOGICAL GM_AdvForm
      LOGICAL GM_AdvSeparate
      LOGICAL GM_ExtraDiag
      LOGICAL GM_InMomAsStress
      LOGICAL GM_MNC
      LOGICAL GM_MDSIO
      COMMON /GM_PARAMS_L/
     &                   GM_AdvForm, GM_AdvSeparate,
     &                   GM_ExtraDiag, GM_MNC, GM_MDSIO,
     &                   GM_InMomAsStress
      CHARACTER*(40) GM_taper_scheme
      COMMON /GM_PARAMS_C/
     &                   GM_taper_scheme
      Real*8 GM_isopycK
      Real*8 GM_background_K
      Real*8 GM_maxSlope
      Real*8 GM_Kmin_horiz
      Real*8 GM_Small_Number
      Real*8 GM_slopeSqCutoff
      Real*8 GM_Visbeck_alpha
      Real*8 GM_Visbeck_length
      Real*8 GM_Visbeck_depth
      Real*8 GM_Visbeck_minDepth
      Real*8 GM_Visbeck_maxSlope
      Real*8 GM_Visbeck_minVal_K
      Real*8 GM_Visbeck_maxVal_K
      Real*8 GM_facTrL2dz
      Real*8 GM_facTrL2ML
      Real*8 GM_maxTransLay
      Real*8 GM_Scrit
      Real*8 GM_Sd
      COMMON /GM_PARAMS_R/
     &                   GM_isopycK, GM_background_K,
     &                   GM_maxSlope,
     &                   GM_Kmin_horiz,
     &                   GM_Small_Number, GM_slopeSqCutoff,
     &                   GM_Visbeck_alpha, GM_Visbeck_length,
     &                   GM_Visbeck_depth,
     &                   GM_Visbeck_minDepth, GM_Visbeck_maxSlope,
     &                   GM_Visbeck_minVal_K, GM_Visbeck_maxVal_K,
     &                   GM_facTrL2dz, GM_facTrL2ML, GM_maxTransLay,
     &                   GM_Scrit, GM_Sd
      Real*8 GM_rMaxSlope
      Real*8 GM_skewflx
      Real*8 GM_advect
      COMMON /GM_DERIVED_PAR/
     &                   GM_rMaxSlope,
     &                   GM_skewflx, GM_advect
      Real*8 Kwx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_Wtensor/ Kwx,Kwy,Kwz
      Real*8 Kux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_HorTensor/ Kux,Kvy
      Real*8 Kuz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_UVtensor/ Kuz,Kvz
      INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
      Real*8 myCurrentTime
      INTEGER myThid
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE TAUEDDY_INIT_VARIA( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER myThid
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
      SUBROUTINE TIMESTEP( bi, bj, iMin, iMax, jMin, jMax, k,
     I                     dPhiHydX,dPhiHydY, phiSurfX, phiSurfY,
     I                     guDissip, gvDissip,
     I                     myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER maxNoChkptLev
      PARAMETER ( maxNoChkptLev = 2 )
      COMMON / RESTART_I /
     &  nCheckLev,
     &  tempStartAB, saltStartAB,
     &  mom_StartAB, nHydStartAB,
     &  dPhiNHstatus
      INTEGER nCheckLev
      INTEGER tempStartAB
      INTEGER saltStartAB
      INTEGER mom_StartAB
      INTEGER nHydStartAB
      INTEGER dPhiNHstatus
      COMMON / RESTART_C /
     &  checkPtSuff
      CHARACTER*(5) checkPtSuff(maxNoChkptLev)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER bi,bj,iMin,iMax,jMin,jMax
      INTEGER k
      Real*8     dPhiHydX(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8     dPhiHydY(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8     phiSurfX(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8     phiSurfY(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8     guDissip(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8     gvDissip(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8     myTime
      INTEGER myIter, myThid
      INTEGER i,j
      Real*8 phxFac,phyFac, psFac
      Real*8     gUtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8     gVtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      LOGICAL externForcDiagIsOn
      Real*8     guCor(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8     gvCor(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      psFac = pfFacMom*(1.d0 - implicSurfPress)
     &       *recip_deepFacC(k)*recip_rhoFacC(k)
      phxFac = pfFacMom
      phyFac = pfFacMom
      externForcDiagIsOn = useDiagnostics .AND. momForcing
      DO j=1-Oly,sNy+Oly
        DO i=1-Olx,sNx+Olx
          gUtmp(i,j) = 0.d0
          gVtmp(i,j) = 0.d0
          guCor(i,j) = 0.d0
          gvCor(i,j) = 0.d0
        ENDDO
      ENDDO
      IF ( .NOT.staggerTimeStep .AND. .NOT. implicitIntGravWave ) THEN
        DO j=jMin,jMax
         DO i=iMin,iMax
           gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj) - phxFac*dPhiHydX(i,j)
           gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj) - phyFac*dPhiHydY(i,j)
         ENDDO
        ENDDO
        phxFac = 0.
        phyFac = 0.
      ENDIF
      IF ( momViscosity .AND. momDissip_In_AB) THEN
        DO j=jMin,jMax
         DO i=iMin,iMax
           gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj) + guDissip(i,j)
           gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj) + gvDissip(i,j)
         ENDDO
        ENDDO
      ENDIF
      IF ( momForcing .AND. momForcingOutAB.NE.1 ) THEN
        CALL EXTERNAL_FORCING_U(
     I     iMin,iMax,jMin,jMax,bi,bj,k,
     I     myTime,myThid)
        CALL EXTERNAL_FORCING_V(
     I     iMin,iMax,jMin,jMax,bi,bj,k,
     I     myTime,myThid)
      ENDIF
      CALL ADAMS_BASHFORTH2(
     I                        bi, bj, k,
     U                        gU, guNm1,
     I                        mom_StartAB, myIter, myThid )
      CALL ADAMS_BASHFORTH2(
     I                        bi, bj, k,
     U                        gV, gvNm1,
     I                        mom_StartAB, myIter, myThid )
      IF ( momForcing .AND. momForcingOutAB.EQ.1 ) THEN
        CALL EXTERNAL_FORCING_U(
     I     iMin,iMax,jMin,jMax,bi,bj,k,
     I     myTime,myThid)
        CALL EXTERNAL_FORCING_V(
     I     iMin,iMax,jMin,jMax,bi,bj,k,
     I     myTime,myThid)
      ENDIF
      IF (useCDscheme) THEN
        DO j=jMin,jMax
         DO i=iMin,iMax
           gUtmp(i,j) = gU(i,j,k,bi,bj)
           gVtmp(i,j) = gV(i,j,k,bi,bj)
         ENDDO
        ENDDO
        IF ( momViscosity .AND. .NOT.momDissip_In_AB ) THEN
         DO j=jMin,jMax
          DO i=iMin,iMax
           gUtmp(i,j) = gUtmp(i,j) + guDissip(i,j)
           gVtmp(i,j) = gVtmp(i,j) + gvDissip(i,j)
          ENDDO
         ENDDO
        ENDIF
        CALL CD_CODE_SCHEME(
     I                  bi,bj,k, dPhiHydX,dPhiHydY, gUtmp,gVtmp,
     O                  guCor,gvCor,
     I                  myTime, myIter, myThid)
        DO j=jMin,jMax
         DO i=iMin,iMax
           gUtmp(i,j) = gU(i,j,k,bi,bj)
     &                + guCor(i,j)
           gVtmp(i,j) = gV(i,j,k,bi,bj)
     &                + gvCor(i,j)
         ENDDO
        ENDDO
      ELSE
        DO j=jMin,jMax
         DO i=iMin,iMax
           gUtmp(i,j) = gU(i,j,k,bi,bj)
           gVtmp(i,j) = gV(i,j,k,bi,bj)
         ENDDO
        ENDDO
      ENDIF
      IF ( momViscosity .AND. .NOT.momDissip_In_AB ) THEN
        DO j=jMin,jMax
         DO i=iMin,iMax
          gUtmp(i,j) = gUtmp(i,j) + guDissip(i,j)
          gVtmp(i,j) = gVtmp(i,j) + gvDissip(i,j)
         ENDDO
        ENDDO
      ENDIF
      DO j=jMin,jMax
        DO i=iMin,iMax
          gU(i,j,k,bi,bj) = uVel(i,j,k,bi,bj)
     &     +deltaTmom*(
     &         gUtmp(i,j)
     &       - psFac*phiSurfX(i,j)
     &       - phxFac*dPhiHydX(i,j)
     &        )*maskW(i,j,k,bi,bj)
        ENDDO
      ENDDO
      DO j=jMin,jMax
        DO i=iMin,iMax
          gV(i,j,k,bi,bj) = vVel(i,j,k,bi,bj)
     &     +deltaTmom*(
     &         gVtmp(i,j)
     &       - psFac*phiSurfY(i,j)
     &       - phyFac*dPhiHydY(i,j)
     &        )*maskS(i,j,k,bi,bj)
        ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
 
      SUBROUTINE THE_MAIN_LOOP( myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 SItoBar, SItodBar
      PARAMETER ( SItoBar  = 1.D-05 )
      PARAMETER ( SItodBar = 1.D-04 )
      COMMON /PARM_EOS_LIN/ tAlpha,sBeta,equationOfState
      Real*8 tAlpha
      Real*8 sBeta
      character*(6) equationOfState
      COMMON /PARM_EOS_NL/ eosC,eosSig0,eosRefT,eosRefS
      Real*8 eosC(9,Nr+1),eosSig0(Nr+1),eosRefT(Nr+1),eosRefS(Nr+1)
      Real*8 eosJMDCFw(6), eosJMDCSw(9)
      Real*8 eosJMDCKFw(5), eosJMDCKSw(7), eosJMDCKP(14)
      COMMON /PARM_EOS_JMD95/
     &     eosJMDCFw, eosJMDCSw, eosJMDCKFw, eosJMDCKSw, eosJMDCKP
      Real*8 eosMDJWFnum(0:11), eosMDJWFden(0:12)
      COMMON /PARM_EOS_MDJWF/ 
     &     eosMDJWFnum, eosMDJWFden
      integer ilev_1
      integer ilev_2
      integer ilev_3
      integer ilev_4
      integer max_lev2
      integer max_lev3
      integer max_lev4
      integer NDV3D, NDV2D, NEXF1, NEXF2, NCTRL1, NOB, NSI
      PARAMETER (NDV3D  = 12)
      PARAMETER (NDV2D  = 23)
      PARAMETER (NEXF1  = 21)
      PARAMETER (NEXF2  = 18)
      PARAMETER (NCTRL1 = 18)
      PARAMETER (NOB = 18)
      PARAMETER (NSI = 19)
      Real*8 StoreDynVars3D
     &    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy,NDV3D)
      Real*8 StoreDynVars2D
     &    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy,NDV2D)
      Real*8 StoreEXF1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy,NEXF1)
      Real*8 StoreEXF2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy,NEXF2)
      Real*8 StoreCTRLS1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy,NCTRL1)
      Real*8 StoreOBCSN(1-Olx:sNx+Olx,Nr,nSx,nSy,NOB)
      Real*8 StoreOBCSS(1-Olx:sNx+Olx,Nr,nSx,nSy,NOB)
      Real*8 StoreOBCSE(1-OLy:sNy+OLy,Nr,nSx,nSy,NOB)
      Real*8 StoreOBCSW(1-OLy:sNy+OLy,Nr,nSx,nSy,NOB)
      Real*8 StoreSEAICE(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy,NSI)
      COMMON /AUTODIFF_STORE_DYN/
     &       StoreDynVars3D,
     &       StoreDynVars2D
      COMMON /AUTODIFF_STORE_EXF_FLUX/
     &       StoreEXF1
      COMMON /AUTODIFF_STORE_EXF_ATMOS/
     &       StoreEXF2
      COMMON /AUTODIFF_STORE_CTRL/
     &       StoreCTRLS1
      COMMON /AUTODIFF_STORE_OBCSN/
     &       StoreOBCSN
      COMMON /AUTODIFF_STORE_OBCSS/
     &       StoreOBCSS
      COMMON /AUTODIFF_STORE_OBCSE/
     &       StoreOBCSE
      COMMON /AUTODIFF_STORE_OBCSW/
     &       StoreOBCSW
      COMMON /AUTODIFF_STORE_SEAICE/
     &       StoreSEAICE
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      COMMON /DYNVARS_CD/
     &                   uVelD, vVelD,
     &                   etaNm1,
     &                   uNM1,  vNM1
      Real*8  uVelD (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVelD (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  etaNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uNM1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vNM1  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
c
c
c
c
c
c
c
      integer     dimgen2d
      integer     dimgen3d
      parameter ( dimgen2d = 1, dimgen3d = 0 )
      integer     maxcvars
      parameter ( maxcvars = 60 )
      integer     ctrlprec
      parameter ( ctrlprec = 64 )
      common /controlparams_r/
     &                       delZexp,
     &                       forcingPrecond
      Real*8 delZexp
      Real*8 forcingPrecond
      common /controlvars_l /
     &                       doInitXX,
     &                       doAdmTlm,
     &                       doPackDiag,
     &                       doZscaleUnpack,
     &                       doZscalePack,
     &                       doMainUnpack,
     &                       doMainPack,
     &                       doSinglePrecTapelev,
     &                       doAdmtlmBypassAD
      logical doInitXX
      logical doAdmTlm
      logical doPackDiag
      logical doZscaleUnpack
      logical doZscalePack
      logical doMainUnpack
      logical doMainPack
      logical doSinglePrecTapelev
      logical doAdmtlmBypassAD
      common /controlvars_i/
     &                       nvartype,
     &                       nvarlength,
     &                       ncvarindex,
     &                       ncvarrecs,
     &                       ncvarrecstart,
     &                       ncvarrecsend,
     &                       ncvarxmax,
     &                       ncvarymax,
     &                       ncvarnrmax,
     &                       nwetctile,
     &                       nwetstile,
     &                       nwetwtile,
     &                       nwetvtile,
     &                       nwetcglobal,
     &                       nwetsglobal,
     &                       nwetwglobal,
     &                       nwetvglobal,
     &                       nbuffglobal
      integer nvartype
      integer nvarlength
      integer ncvarindex    ( maxcvars )
      integer ncvarrecs     ( maxcvars )
      integer ncvarrecstart ( maxcvars )
      integer ncvarrecsend  ( maxcvars )
      integer ncvarxmax     ( maxcvars )
      integer ncvarymax     ( maxcvars )
      integer ncvarnrmax    ( maxcvars )
      integer nwetctile     ( nsx,nsy,nr )
      integer nwetstile     ( nsx,nsy,nr )
      integer nwetwtile     ( nsx,nsy,nr )
      integer nwetvtile     ( nsx,nsy,nr )
      integer nwetcglobal     ( nr )
      integer nwetsglobal     ( nr )
      integer nwetwglobal     ( nr )
      integer nwetvglobal     ( nr )
      integer nbuffglobal
      common /controlvars_c/
     &                       ncvargrd
     &                     , yadprefix
      character*(1) ncvargrd(maxcvars)
      character*(2) yadprefix
      common /controlvec_header_i/
     &        filenvartype,
     &        filenvarlength,
     &        fileOptimCycle,
     &        filencbuffindex,
     &        fileIg,
     &        fileJg,
     &        fileI,
     &        fileJ,
     &        filensx,
     &        filensy,
     &        filek,
     &        filenWetcGlobal,
     &        filenWetsGlobal,
     &        filenWetwGlobal,
     &        filenWetvGlobal,
     &        filencvarindex,
     &        filencvarrecs,
     &        filencvarxmax,
     &        filencvarymax,
     &        filencvarnrmax
      integer        filenvartype
      integer        filenvarlength
      integer        fileOptimCycle
      integer        filencbuffindex
      integer        fileIg
      integer        fileJg
      integer        fileI
      integer        fileJ
      integer        filensx
      integer        filensy
      integer        filek
      integer        filenWetcGlobal(nr)
      integer        filenWetsGlobal(nr)
      integer        filenWetwGlobal(nr)
      integer        filenWetvGlobal(nr)
      integer        filencvarindex(maxcvars)
      integer        filencvarrecs(maxcvars)
      integer        filencvarxmax(maxcvars)
      integer        filencvarymax(maxcvars)
      integer        filencvarnrmax(maxcvars)
      common /controlvec_header_r/
     &               filefc
      Real*8            filefc
      common /controlvec_header_c/
     &        fileYctrlid,
     &        filencvargrd
      character*(10) fileYctrlid
      character*( 1) filencvargrd(maxcvars)
      common /ctrl_weights_unit_r/
     &                        wunit,
     &                        wareaunit
      Real*8 wunit     (nr,nsx,nsy)
      Real*8 wareaunit (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ctrl_weights_atmos_r/
     &                      whflux,
     &                      wsflux,
     &                      wtauu,
     &                      wtauv,
     &                      watemp,
     &                      waqh,
     &                      wprecip,
     &                      wswflux,
     &                      wswdown,
     &                      wuwind,
     &                      wvwind,
     &                      wlwflux,
     &                      wlwdown,
     &                      wevap,
     &                      wsnowprecip,
     &                      wapressure,
     &                      wrunoff,
     &                      wsst,
     &                      wsss,
     &                      wbp
      Real*8 whflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsflux  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauu   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wtauv   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 watemp  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 waqh    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wswdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wuwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wvwind  (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwflux (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wlwdown (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wevap   (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsnowprecip (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wapressure(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wrunoff (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsst    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wsss    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 wbp     (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
c
      common /controlvars_r/
     &                        tmpfld2d
     &                      , tmpfld3d
      Real*8 tmpfld2d
     &    (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      Real*8 tmpfld3d
     &    (1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
c
c
      common /controlfiles_c/
     &                      xx_theta_file
     &                    , xx_salt_file
     &                    , xx_hflux_file
     &                    , xx_sflux_file
     &                    , xx_tauu_file
     &                    , xx_tauv_file
     &                    , xx_atemp_file
     &                    , xx_aqh_file
     &                    , xx_precip_file
     &                    , xx_swflux_file
     &                    , xx_swdown_file
     &                    , xx_lwflux_file
     &                    , xx_lwdown_file
     &                    , xx_evap_file
     &                    , xx_snowprecip_file
     &                    , xx_apressure_file
     &                    , xx_runoff_file
     &                    , xx_uwind_file
     &                    , xx_vwind_file
     &                    , xx_obcsn_file
     &                    , xx_obcss_file
     &                    , xx_obcsw_file
     &                    , xx_obcse_file
     &                    , xx_diffkr_file
     &                    , xx_kapgm_file
     &                    , xx_kapredi_file
     &                    , xx_tr1_file
     &                    , xx_sst_file
     &                    , xx_sss_file
     &                    , xx_depth_file
     &                    , xx_efluxy_file
     &                    , xx_efluxp_file
     &                    , xx_bottomdrag_file
     &                    , xx_edtaux_file
     &                    , xx_edtauy_file
     &                    , xx_uvel_file
     &                    , xx_vvel_file
     &                    , xx_etan_file
     &                    , xx_relaxsst_file
     &                    , xx_relaxsss_file
     &                    , xx_theta_ini_fin_file
     &                    , xx_salt_ini_fin_file
     &                    , xx_siarea_file
     &                    , xx_siheff_file
     &                    , xx_sihsnow_file
     &                    , xx_gen2d_file
     &                    , xx_gen3d_file
cHFLUXM_CONTROL
     &                    , xx_hfluxm_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_theta_file
      character*(MAX_LEN_FNAM) xx_salt_file
      character*(MAX_LEN_FNAM) xx_hflux_file
      character*(MAX_LEN_FNAM) xx_sflux_file
      character*(MAX_LEN_FNAM) xx_tauu_file
      character*(MAX_LEN_FNAM) xx_tauv_file
      character*(MAX_LEN_FNAM) xx_atemp_file
      character*(MAX_LEN_FNAM) xx_aqh_file
      character*(MAX_LEN_FNAM) xx_precip_file
      character*(MAX_LEN_FNAM) xx_swflux_file
      character*(MAX_LEN_FNAM) xx_swdown_file
      character*(MAX_LEN_FNAM) xx_lwflux_file
      character*(MAX_LEN_FNAM) xx_lwdown_file
      character*(MAX_LEN_FNAM) xx_evap_file
      character*(MAX_LEN_FNAM) xx_snowprecip_file
      character*(MAX_LEN_FNAM) xx_apressure_file
      character*(MAX_LEN_FNAM) xx_runoff_file
      character*(MAX_LEN_FNAM) xx_uwind_file
      character*(MAX_LEN_FNAM) xx_vwind_file
      character*(MAX_LEN_FNAM) xx_obcsn_file
      character*(MAX_LEN_FNAM) xx_obcss_file
      character*(MAX_LEN_FNAM) xx_obcsw_file
      character*(MAX_LEN_FNAM) xx_obcse_file
      character*(MAX_LEN_FNAM) xx_diffkr_file
      character*(MAX_LEN_FNAM) xx_kapgm_file
      character*(MAX_LEN_FNAM) xx_kapredi_file
      character*(MAX_LEN_FNAM) xx_tr1_file
      character*(MAX_LEN_FNAM) xx_sst_file
      character*(MAX_LEN_FNAM) xx_sss_file
      character*(MAX_LEN_FNAM) xx_depth_file
      character*(MAX_LEN_FNAM) xx_efluxy_file
      character*(MAX_LEN_FNAM) xx_efluxp_file
      character*(MAX_LEN_FNAM) xx_bottomdrag_file
      character*(MAX_LEN_FNAM) xx_edtaux_file
      character*(MAX_LEN_FNAM) xx_edtauy_file
      character*(MAX_LEN_FNAM) xx_uvel_file
      character*(MAX_LEN_FNAM) xx_vvel_file
      character*(MAX_LEN_FNAM) xx_etan_file
      character*(MAX_LEN_FNAM) xx_relaxsst_file
      character*(MAX_LEN_FNAM) xx_relaxsss_file
      character*(MAX_LEN_FNAM) xx_theta_ini_fin_file
      character*(MAX_LEN_FNAM) xx_salt_ini_fin_file
      character*(MAX_LEN_FNAM) xx_siarea_file
      character*(MAX_LEN_FNAM) xx_siheff_file
      character*(MAX_LEN_FNAM) xx_sihsnow_file
      character*(MAX_LEN_FNAM) xx_gen2d_file
      character*(MAX_LEN_FNAM) xx_gen3d_file
cHFLUXM_CONTROL
      character*(MAX_LEN_FNAM) xx_hfluxm_file
cHFLUXM_CONTROL
      common /packnames_c/
     &                      yadmark,
     &                      ctrlname,
     &                      costname,
     &                      scalname,
     &                      maskname,
     &                      metaname,
     &                      yctrlid,
     &                      yctrlposunpack,
     &                      yctrlpospack
      character*2 yadmark
      character*9 ctrlname
      character*9 costname
      character*9 scalname
      character*9 maskname
      character*9 metaname
      character*10 yctrlid
      character*4 yctrlposunpack
      character*4 yctrlpospack
c
      common /controltimes_r/
     &                        xx_hfluxperiod
     &                      , xx_sfluxperiod
     &                      , xx_tauuperiod
     &                      , xx_tauvperiod
     &                      , xx_atempperiod
     &                      , xx_aqhperiod
     &                      , xx_precipperiod
     &                      , xx_swfluxperiod
     &                      , xx_swdownperiod
     &                      , xx_lwfluxperiod
     &                      , xx_lwdownperiod
     &                      , xx_evapperiod
     &                      , xx_snowprecipperiod
     &                      , xx_apressureperiod
     &                      , xx_runoffperiod
     &                      , xx_uwindperiod
     &                      , xx_vwindperiod
     &                      , xx_sstperiod
     &                      , xx_sssperiod
     &                      , xx_obcsnperiod
     &                      , xx_obcssperiod
     &                      , xx_obcswperiod
     &                      , xx_obcseperiod
      Real*8     xx_hfluxperiod
      Real*8     xx_sfluxperiod
      Real*8     xx_tauuperiod
      Real*8     xx_tauvperiod
      Real*8     xx_atempperiod
      Real*8     xx_aqhperiod
      Real*8     xx_precipperiod
      Real*8     xx_swfluxperiod
      Real*8     xx_swdownperiod
      Real*8     xx_lwfluxperiod
      Real*8     xx_lwdownperiod
      Real*8     xx_evapperiod
      Real*8     xx_snowprecipperiod
      Real*8     xx_apressureperiod
      Real*8     xx_runoffperiod
      Real*8     xx_uwindperiod
      Real*8     xx_vwindperiod
      Real*8     xx_sstperiod
      Real*8     xx_sssperiod
      Real*8     xx_obcsnperiod
      Real*8     xx_obcssperiod
      Real*8     xx_obcswperiod
      Real*8     xx_obcseperiod
      common /ctrl_param_trend_removal/
     &       xx_hflux_remo_intercept, xx_hflux_remo_slope,
     &       xx_sflux_remo_intercept, xx_sflux_remo_slope,
     &       xx_tauu_remo_intercept, xx_tauu_remo_slope,
     &       xx_tauv_remo_intercept, xx_tauv_remo_slope,
     &       xx_atemp_remo_intercept, xx_atemp_remo_slope,
     &       xx_aqh_remo_intercept, xx_aqh_remo_slope,
     &       xx_precip_remo_intercept, xx_precip_remo_slope,
     &       xx_swflux_remo_intercept, xx_swflux_remo_slope,
     &       xx_swdown_remo_intercept, xx_swdown_remo_slope,
     &       xx_lwflux_remo_intercept, xx_lwflux_remo_slope,
     &       xx_lwdown_remo_intercept, xx_lwdown_remo_slope,
     &       xx_evap_remo_intercept, xx_evap_remo_slope,
     &       xx_snowprecip_remo_intercept, 
     &       xx_snowprecip_remo_slope,
     &       xx_apressure_remo_intercept, 
     &       xx_apressure_remo_slope,
     &       xx_runoff_remo_intercept, xx_runoff_remo_slope,
     &       xx_uwind_remo_intercept, xx_uwind_remo_slope,
     &       xx_vwind_remo_intercept, xx_vwind_remo_slope
      Real*8 xx_hflux_remo_intercept, xx_hflux_remo_slope
      Real*8 xx_sflux_remo_intercept, xx_sflux_remo_slope
      Real*8 xx_tauu_remo_intercept, xx_tauu_remo_slope
      Real*8 xx_tauv_remo_intercept, xx_tauv_remo_slope
      Real*8 xx_atemp_remo_intercept, xx_atemp_remo_slope
      Real*8 xx_aqh_remo_intercept, xx_aqh_remo_slope
      Real*8 xx_precip_remo_intercept, xx_precip_remo_slope
      Real*8 xx_swflux_remo_intercept, xx_swflux_remo_slope
      Real*8 xx_swdown_remo_intercept, xx_swdown_remo_slope
      Real*8 xx_lwflux_remo_intercept, xx_lwflux_remo_slope
      Real*8 xx_lwdown_remo_intercept, xx_lwdown_remo_slope
      Real*8 xx_evap_remo_intercept, xx_evap_remo_slope
      Real*8 xx_snowprecip_remo_intercept
      Real*8 xx_snowprecip_remo_slope
      Real*8 xx_apressure_remo_intercept
      Real*8 xx_apressure_remo_slope
      Real*8 xx_runoff_remo_intercept, xx_runoff_remo_slope
      Real*8 xx_uwind_remo_intercept, xx_uwind_remo_slope
      Real*8 xx_vwind_remo_intercept, xx_vwind_remo_slope
      common /controltimes_i/
     &                        xx_hfluxstartdate1
     &                      , xx_hfluxstartdate2
     &                      , xx_sfluxstartdate1
     &                      , xx_sfluxstartdate2
     &                      , xx_tauustartdate1
     &                      , xx_tauustartdate2
     &                      , xx_tauvstartdate1
     &                      , xx_tauvstartdate2
     &                      , xx_atempstartdate1
     &                      , xx_atempstartdate2
     &                      , xx_aqhstartdate1
     &                      , xx_aqhstartdate2
     &                      , xx_precipstartdate1
     &                      , xx_precipstartdate2
     &                      , xx_swfluxstartdate1
     &                      , xx_swfluxstartdate2
     &                      , xx_swdownstartdate1
     &                      , xx_swdownstartdate2
     &                      , xx_snowprecipstartdate1
     &                      , xx_snowprecipstartdate2
     &                      , xx_lwfluxstartdate1
     &                      , xx_lwfluxstartdate2
     &                      , xx_lwdownstartdate1
     &                      , xx_lwdownstartdate2
     &                      , xx_evapstartdate1
     &                      , xx_evapstartdate2
     &                      , xx_apressurestartdate1
     &                      , xx_apressurestartdate2
     &                      , xx_runoffstartdate1
     &                      , xx_runoffstartdate2
     &                      , xx_uwindstartdate1
     &                      , xx_uwindstartdate2
     &                      , xx_vwindstartdate1
     &                      , xx_vwindstartdate2
     &                      , xx_sststartdate1
     &                      , xx_sststartdate2
     &                      , xx_sssstartdate1
     &                      , xx_sssstartdate2
     &                      , xx_hfluxstartdate
     &                      , xx_sfluxstartdate
     &                      , xx_tauustartdate
     &                      , xx_tauvstartdate
     &                      , xx_atempstartdate
     &                      , xx_aqhstartdate
     &                      , xx_precipstartdate
     &                      , xx_swfluxstartdate
     &                      , xx_swdownstartdate
     &                      , xx_uwindstartdate
     &                      , xx_snowprecipstartdate
     &                      , xx_lwfluxstartdate
     &                      , xx_lwdownstartdate
     &                      , xx_evapstartdate
     &                      , xx_apressurestartdate
     &                      , xx_runoffstartdate
     &                      , xx_vwindstartdate
     &                      , xx_sststartdate
     &                      , xx_sssstartdate
     &                      , xx_obcsnstartdate1
     &                      , xx_obcsnstartdate2
     &                      , xx_obcssstartdate1
     &                      , xx_obcssstartdate2
     &                      , xx_obcswstartdate1
     &                      , xx_obcswstartdate2
     &                      , xx_obcsestartdate1
     &                      , xx_obcsestartdate2
     &                      , xx_obcsnstartdate
     &                      , xx_obcssstartdate
     &                      , xx_obcswstartdate
     &                      , xx_obcsestartdate
      integer xx_hfluxstartdate1
      integer xx_hfluxstartdate2
      integer xx_sfluxstartdate1
      integer xx_sfluxstartdate2
      integer xx_tauustartdate1
      integer xx_tauustartdate2
      integer xx_tauvstartdate1
      integer xx_tauvstartdate2
      integer xx_atempstartdate1
      integer xx_atempstartdate2
      integer xx_aqhstartdate1
      integer xx_aqhstartdate2
      integer xx_precipstartdate1
      integer xx_precipstartdate2
      integer xx_swfluxstartdate1
      integer xx_swfluxstartdate2
      integer xx_swdownstartdate1
      integer xx_swdownstartdate2
      integer xx_snowprecipstartdate1
      integer xx_snowprecipstartdate2
      integer xx_lwfluxstartdate1
      integer xx_lwfluxstartdate2
      integer xx_lwdownstartdate1
      integer xx_lwdownstartdate2
      integer xx_evapstartdate1
      integer xx_evapstartdate2
      integer xx_apressurestartdate1
      integer xx_apressurestartdate2
      integer xx_runoffstartdate1
      integer xx_runoffstartdate2
      integer xx_uwindstartdate1
      integer xx_uwindstartdate2
      integer xx_vwindstartdate1
      integer xx_vwindstartdate2
      integer xx_sststartdate1
      integer xx_sststartdate2
      integer xx_sssstartdate1
      integer xx_sssstartdate2
      integer xx_obcsnstartdate1
      integer xx_obcsnstartdate2
      integer xx_obcssstartdate1
      integer xx_obcssstartdate2
      integer xx_obcswstartdate1
      integer xx_obcswstartdate2
      integer xx_obcsestartdate1
      integer xx_obcsestartdate2
      integer xx_hfluxstartdate(4)
      integer xx_sfluxstartdate(4)
      integer xx_tauustartdate(4)
      integer xx_tauvstartdate(4)
      integer xx_atempstartdate(4)
      integer xx_aqhstartdate(4)
      integer xx_precipstartdate(4)
      integer xx_swfluxstartdate(4)
      integer xx_swdownstartdate(4)
      integer xx_snowprecipstartdate(4)
      integer xx_lwfluxstartdate(4)
      integer xx_lwdownstartdate(4)
      integer xx_evapstartdate(4)
      integer xx_apressurestartdate(4)
      integer xx_runoffstartdate(4)
      integer xx_uwindstartdate(4)
      integer xx_vwindstartdate(4)
      integer xx_sststartdate(4)
      integer xx_sssstartdate(4)
      integer xx_obcsnstartdate(4)
      integer xx_obcssstartdate(4)
      integer xx_obcswstartdate(4)
      integer xx_obcsestartdate(4)
      character*( 80)   fname_theta(2)
      character*( 80)   fname_salt(2)
      character*( 80)   fname_hflux(2)
      character*( 80)   fname_sflux(2)
      character*( 80)   fname_tauu(2)
      character*( 80)   fname_tauv(2)
      character*( 80)   fname_atemp(2)
      character*( 80)   fname_aqh(2)
      character*( 80)   fname_precip(2)
      character*( 80)   fname_swflux(2)
      character*( 80)   fname_swdown(2)
      character*( 80)   fname_snowprecip(2)
      character*( 80)   fname_lwflux(2)
      character*( 80)   fname_lwdown(2)
      character*( 80)   fname_evap(2)
      character*( 80)   fname_apressure(2)
      character*( 80)   fname_runoff(2)
      character*( 80)   fname_uwind(2)
      character*( 80)   fname_vwind(2)
      character*( 80)   fname_obcsn(2)
      character*( 80)   fname_obcss(2)
      character*( 80)   fname_obcsw(2)
      character*( 80)   fname_obcse(2)
      character*( 80)   fname_diffkr(2)
      character*( 80)   fname_kapgm(2)
      character*( 80)   fname_kapredi(2)
      character*( 80)   fname_tr1(2)
      character*( 80)   fname_sst(2)
      character*( 80)   fname_sss(2)
      character*( 80)   fname_depth(2)
      character*( 80)   fname_hfacc(2)
      character*( 80)   fname_efluxy(2)
      character*( 80)   fname_efluxp(2)
      character*( 80)   fname_bottomdrag(2)
      character*( 80)   fname_edtaux(2)
      character*( 80)   fname_edtauy(2)
      character*( 80)   fname_uvel(2)
      character*( 80)   fname_vvel(2)
      character*( 80)   fname_etan(2)
      character*( 80)   fname_relaxsst(2)
      character*( 80)   fname_relaxsss(2)
      character*( 80)   fname_siarea(2)
      character*( 80)   fname_siheff(2)
      character*( 80)   fname_sihsnow(2)
      character*( 80)   fname_gen2d(2)
      character*( 80)   fname_gen3d(2)
cHFLUXM_CONTROL
      character*( 80)   fname_hfluxm(2)
cHFLUXM_CONTROL
c
c
      common /ctrl_dummy/
     &                    xx_theta_dummy
     &                  , xx_salt_dummy
     &                  , xx_hflux_dummy
     &                  , xx_sflux_dummy
     &                  , xx_tauu_dummy
     &                  , xx_tauv_dummy
     &                  , xx_atemp_dummy
     &                  , xx_aqh_dummy
     &                  , xx_precip_dummy
     &                  , xx_swflux_dummy
     &                  , xx_swdown_dummy
     &                  , xx_snowprecip_dummy
     &                  , xx_lwflux_dummy
     &                  , xx_lwdown_dummy
     &                  , xx_evap_dummy
     &                  , xx_apressure_dummy
     &                  , xx_runoff_dummy
     &                  , xx_uwind_dummy
     &                  , xx_vwind_dummy
     &                  , xx_obcsn_dummy
     &                  , xx_obcss_dummy
     &                  , xx_obcsw_dummy
     &                  , xx_obcse_dummy
     &                  , xx_diffkr_dummy
     &                  , xx_kapgm_dummy
     &                  , xx_kapredi_dummy
     &                  , xx_tr1_dummy
     &                  , xx_sst_dummy
     &                  , xx_sss_dummy
     &                  , xx_depth_dummy
     &                  , xx_efluxy_dummy
     &                  , xx_efluxp_dummy
     &                  , xx_bottomdrag_dummy
     &                  , xx_edtaux_dummy
     &                  , xx_edtauy_dummy
     &                  , xx_uvel_dummy
     &                  , xx_vvel_dummy
     &                  , xx_etan_dummy
     &                  , xx_siarea_dummy
     &                  , xx_siheff_dummy
     &                  , xx_sihsnow_dummy
     &                  , xx_relaxsst_dummy
     &                  , xx_relaxsss_dummy
     &                  , xx_tbar_mean_dummy
     &                  , xx_tbar_daily_mean_dummy
     &                  , xx_sbar_mean_dummy
     &                  , xx_sbar_daily_mean_dummy
     &                  , xx_ubar_mean_dummy
     &                  , xx_vbar_mean_dummy
     &                  , xx_wbar_mean_dummy
     &                  , xx_psbar_mean_dummy
     &                  , xx_bpbar_mean_dummy
     &                  , xx_taux_mean_dummy
     &                  , xx_tauy_mean_dummy
     &                  , xx_hflux_mean_dummy
     &                  , xx_sflux_mean_dummy
     &                  , xx_sstbar_mean_dummy
     &                  , xx_sssbar_mean_dummy
     &                  , xx_atemp_mean_dummy
     &                  , xx_aqh_mean_dummy
     &                  , xx_precip_mean_dummy
     &                  , xx_swflux_mean_dummy
     &                  , xx_swdown_mean_dummy
     &                  , xx_snowprecip_mean_dummy
     &                  , xx_lwflux_mean_dummy
     &                  , xx_lwdown_mean_dummy
     &                  , xx_evap_mean_dummy
     &                  , xx_apressure_mean_dummy
     &                  , xx_runoff_mean_dummy
     &                  , xx_uwind_mean_dummy
     &                  , xx_vwind_mean_dummy
     &                  , xx_theta_ini_fin_dummy
     &                  , xx_salt_ini_fin_dummy
     &                  , xx_smrareabar_mean_dummy
     &                  , xx_smrsstbar_mean_dummy
     &                  , xx_smrsssbar_mean_dummy
     &                  , xx_gen2d_dummy
     &                  , xx_gen3d_dummy
cHFLUXM_CONTROL
     &                  , xx_hfluxm_dummy
cHFLUXM_CONTROL
      Real*8 xx_theta_dummy
      Real*8 xx_salt_dummy
      Real*8 xx_hflux_dummy
      Real*8 xx_sflux_dummy
      Real*8 xx_tauu_dummy
      Real*8 xx_tauv_dummy
      Real*8 xx_atemp_dummy
      Real*8 xx_aqh_dummy
      Real*8 xx_precip_dummy
      Real*8 xx_swflux_dummy
      Real*8 xx_swdown_dummy
      Real*8 xx_snowprecip_dummy
      Real*8 xx_lwflux_dummy
      Real*8 xx_lwdown_dummy
      Real*8 xx_evap_dummy
      Real*8 xx_apressure_dummy
      Real*8 xx_runoff_dummy
      Real*8 xx_uwind_dummy
      Real*8 xx_vwind_dummy
      Real*8 xx_obcsn_dummy
      Real*8 xx_obcss_dummy
      Real*8 xx_obcsw_dummy
      Real*8 xx_obcse_dummy
      Real*8 xx_diffkr_dummy
      Real*8 xx_kapgm_dummy
      Real*8 xx_kapredi_dummy
      Real*8 xx_tr1_dummy
      Real*8 xx_sst_dummy
      Real*8 xx_sss_dummy
      Real*8 xx_depth_dummy
      Real*8 xx_efluxy_dummy
      Real*8 xx_efluxp_dummy
      Real*8 xx_bottomdrag_dummy
      Real*8 xx_edtaux_dummy
      Real*8 xx_edtauy_dummy
      Real*8 xx_uvel_dummy
      Real*8 xx_vvel_dummy
      Real*8 xx_etan_dummy
      Real*8 xx_siarea_dummy
      Real*8 xx_siheff_dummy
      Real*8 xx_sihsnow_dummy
      Real*8 xx_relaxsst_dummy
      Real*8 xx_relaxsss_dummy
      Real*8 xx_gen2d_dummy
      Real*8 xx_gen3d_dummy
c
      Real*8 xx_tbar_mean_dummy
      Real*8 xx_tbar_daily_mean_dummy
      Real*8 xx_sbar_mean_dummy
      Real*8 xx_sbar_daily_mean_dummy
      Real*8 xx_ubar_mean_dummy
      Real*8 xx_vbar_mean_dummy
      Real*8 xx_wbar_mean_dummy
      Real*8 xx_psbar_mean_dummy
      Real*8 xx_bpbar_mean_dummy
      Real*8 xx_hflux_mean_dummy
      Real*8 xx_sflux_mean_dummy
      Real*8 xx_sstbar_mean_dummy
      Real*8 xx_sssbar_mean_dummy
      Real*8 xx_taux_mean_dummy
      Real*8 xx_tauy_mean_dummy
      Real*8 xx_atemp_mean_dummy
      Real*8 xx_aqh_mean_dummy
      Real*8 xx_precip_mean_dummy
      Real*8 xx_swflux_mean_dummy
      Real*8 xx_swdown_mean_dummy
      Real*8 xx_snowprecip_mean_dummy
      Real*8 xx_lwflux_mean_dummy
      Real*8 xx_lwdown_mean_dummy
      Real*8 xx_evap_mean_dummy
      Real*8 xx_apressure_mean_dummy
      Real*8 xx_runoff_mean_dummy
      Real*8 xx_uwind_mean_dummy
      Real*8 xx_vwind_mean_dummy
      Real*8 xx_theta_ini_fin_dummy
      Real*8 xx_salt_ini_fin_dummy
      Real*8 xx_smrareabar_mean_dummy
      Real*8 xx_smrsstbar_mean_dummy
      Real*8 xx_smrsssbar_mean_dummy
cHFLUXM_CONTROL
      Real*8 xx_hfluxm_dummy
cHFLUXM_CONTROL
c
c
c
c
c
      common /cost_r/
     &                fc
      Real*8  fc
      common /cost_objf/
     &                objf_atl,
     &                objf_test,
     &                objf_tracer,
     &                objf_entropy,
     &                objf_t_misfit,
     &                objf_eflux
cHFLUXM_CONTROL
     &               ,objf_hflux_tut
     &               ,objf_temp_tut
cHFLUXM_CONTROL
      Real*8  objf_atl  (nsx,nsy)
      Real*8  objf_test (nsx,nsy)
      Real*8  objf_tracer (nsx,nsy)
      Real*8  objf_entropy (nsx,nsy)
      Real*8  objf_t_misfit (nsx,nsy)
      Real*8  objf_eflux (nsx,nsy)
cHFLUXM_CONTROL
      Real*8  objf_hflux_tut (nsx,nsy)
      Real*8  objf_temp_tut (nsx,nsy)
cHFLUXM_CONTROL
      common /cost_param_r/
     &                lastinterval
      Real*8 lastinterval
      common /cost_aux_r/
     &                    mult_atl,
     &                    mult_test,
     &                    mult_tracer,
     &                    mult_entropy,
     &                    mult_t_misfit,
     &                    mult_eflux,
     &                    multTheta,
     &                    multSalt,
     &                    multUvel,
     &                    multVvel,
     &                    multEtan
cHFLUXM_CONTROL
     &                   ,mult_hflux_tut
     &                   ,mult_temp_tut
cHFLUXM_CONTROL
      Real*8  mult_atl
      Real*8  mult_test
      Real*8  mult_tracer
      Real*8  mult_entropy
      Real*8  mult_t_misfit
      Real*8  mult_eflux
      Real*8  multTheta
      Real*8  multSalt
      Real*8  multUvel
      Real*8  multVvel
      Real*8  multEtan
cHFLUXM_CONTROL
      Real*8  mult_hflux_tut
      Real*8  mult_temp_tut
cHFLUXM_CONTROL
      COMMON /COST_MEAN_R/
     &                     cMeanTheta, cMeanUVel, cMeanVVel,
     &                     cMeanThetaUVel, cMeanThetaVVel
      Real*8 cMeanTheta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaUVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 cMeanThetaVVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myThid 
      INTEGER myIter
      Real*8     myTime
      integer iloop
      IF (debugMode) CALL DEBUG_ENTER('THE_MAIN_LOOP',myThid)
CADJ  INIT dummytape = common, 1
CADJ  INIT tapelev_ini_bibj_k   = USER
CADJ  INIT tapelev_init   = USER
c
CADJ  INIT tapelev3 = USER
      nIter0 = NINT( (startTime-baseTime)/deltaTClock )
      ikey_dynamics = 1
      IF (debugMode) CALL DEBUG_CALL('INITIALISE_VARIA',myThid)
      CALL TIMER_START('INITIALISE_VARIA    [THE_MAIN_LOOP]', mythid)
      CALL INITIALISE_VARIA( mythid )
      CALL TIMER_STOP ('INITIALISE_VARIA    [THE_MAIN_LOOP]', mythid)
      CALL TIMER_START('MAIN LOOP           [THE_MAIN_LOOP]', mythid)
c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      max_lev4=nTimeSteps/(nchklev_1*nchklev_2*nchklev_3)+1
      max_lev3=nTimeSteps/(nchklev_1*nchklev_2)+1
      max_lev2=nTimeSteps/nchklev_1+1
      do ilev_3 = 1,nchklev_3
         if(ilev_3.le.max_lev3) then
            CALL AUTODIFF_STORE( myThid )
c
c
c
c
CADJ STORE StoreDynVars2D     = tapelev3, key = ilev_3
c
c
c
CADJ STORE StoreDynVars3D     = tapelev3, key = ilev_3
c
cnewCADJ STORE ivdconvcount       = tapelevx, key = ilev_x
CADJ STORE uveld      = tapelev3, key = ilev_3
CADJ STORE vveld     = tapelev3, key = ilev_3
CADJ STORE etanm1    = tapelev3, key = ilev_3
CADJ STORE unm1      = tapelev3, key = ilev_3
CADJ STORE vnm1      = tapelev3, key = ilev_3
 
 
CADJ STORE cMeanTheta = tapelev3, key = ilev_3
CADJ STORE cMeanUVel  = tapelev3, key = ilev_3
CADJ STORE cMeanVVel  = tapelev3, key = ilev_3
CADJ STORE cMeanThetaUVel = tapelev3, key = ilev_3
CADJ STORE cMeanThetaVVel = tapelev3, key = ilev_3
CADJ STORE qnetm          = tapelev3, key = ilev_3
            CALL AUTODIFF_RESTORE( myThid )
CADJ    INIT tapelev2 = USER
        do ilev_2 = 1,nchklev_2
         if(ilev_2.le.max_lev2) then
            CALL AUTODIFF_STORE( myThid )
c
c
c
c
CADJ STORE StoreDynVars2D     = tapelev2, key = ilev_2
c
c
c
CADJ STORE StoreDynVars3D     = tapelev2, key = ilev_2
c
cnewCADJ STORE ivdconvcount       = tapelevx, key = ilev_x
CADJ STORE uveld      = tapelev2, key = ilev_2
CADJ STORE vveld     = tapelev2, key = ilev_2
CADJ STORE etanm1    = tapelev2, key = ilev_2
CADJ STORE unm1      = tapelev2, key = ilev_2
CADJ STORE vnm1      = tapelev2, key = ilev_2
 
 
CADJ STORE cMeanTheta = tapelev2, key = ilev_2
CADJ STORE cMeanUVel  = tapelev2, key = ilev_2
CADJ STORE cMeanVVel  = tapelev2, key = ilev_2
CADJ STORE cMeanThetaUVel = tapelev2, key = ilev_2
CADJ STORE cMeanThetaVVel = tapelev2, key = ilev_2
CADJ STORE qnetm          = tapelev2, key = ilev_2
            CALL AUTODIFF_RESTORE( myThid )
CADJ INIT comlev1        = COMMON,nchklev_1
CADJ INIT comlev1_bibj   = COMMON,nchklev_1*nsx*nsy*nthreads_chkpt
CADJ INIT comlev1_bibj_k = COMMON,nchklev_1*nsx*nsy*nr*nthreads_chkpt
CADJ INIT comlev1_gmredi_k_gad
CADJ &    = COMMON,nchklev_1*nsx*nsy*nr*nthreads_chkpt*maxpass
CADJ INIT comlev1_bibj_k_gad = COMMON,
CADJ &    nchklev_1*nsx*nsy*nr*nthreads_chkpt*maxpass
CADJ INIT comlev1_bibj_k_gad_pass = COMMON,
CADJ &    nchklev_1*nsx*nsy*nr*nthreads_chkpt*maxpass*maxpass
CADJ INIT comlev1_mom_ijk_loop
CADJ &     = COMMON,nchklev_1*
CADJ &       (snx+2*olx)*nsx*(sny+2*oly)*nsy*nr*nthreads_chkpt
          do ilev_1 = 1,nchklev_1
            iloop = (ilev_2 - 1)*nchklev_1                     + ilev_1
     &            + (ilev_3 - 1)*nchklev_2*nchklev_1
            if ( iloop .le. nTimeSteps ) then
        nIter0 = NINT( (startTime-baseTime)/deltaTClock )
        ikey_dynamics = ilev_1
      IF (debugMode) CALL DEBUG_CALL('FORWARD_STEP',myThid)
        CALL TIMER_START('FORWARD_STEP        [THE_MAIN_LOOP]',mythid)
        CALL FORWARD_STEP( iloop, mytime, myiter, mythid )
        CALL TIMER_STOP ('FORWARD_STEP        [THE_MAIN_LOOP]',mythid)
            endif
          enddo
          endif
        enddo
        endif
      enddo
      CALL TIMER_START('COST_FINAL         [ADJOINT SPIN-DOWN]', mythid)
      CALL COST_FINAL ( mythid )
      CALL TIMER_STOP ('COST_FINAL         [ADJOINT SPIN-DOWN]', mythid)
      CALL BARRIER(myThid)
      CALL TIMER_STOP ('MAIN LOOP           [THE_MAIN_LOOP]', mythid)
      IF (debugMode) CALL DEBUG_LEAVE('THE_MAIN_LOOP',myThid)
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
C
C
C
C
C
 
      SUBROUTINE THERMODYNAMICS(myTime, myIter, myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
      INTEGER maxNoChkptLev
      PARAMETER ( maxNoChkptLev = 2 )
      COMMON / RESTART_I /
     &  nCheckLev,
     &  tempStartAB, saltStartAB,
     &  mom_StartAB, nHydStartAB,
     &  dPhiNHstatus
      INTEGER nCheckLev
      INTEGER tempStartAB
      INTEGER saltStartAB
      INTEGER mom_StartAB
      INTEGER nHydStartAB
      INTEGER dPhiNHstatus
      COMMON / RESTART_C /
     &  checkPtSuff
      CHARACTER*(5) checkPtSuff(maxNoChkptLev)
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      INTEGER ENUM_UPWIND_1RST
      PARAMETER(ENUM_UPWIND_1RST=1)
      INTEGER ENUM_CENTERED_2ND
      PARAMETER(ENUM_CENTERED_2ND=2)
      INTEGER ENUM_UPWIND_3RD
      PARAMETER(ENUM_UPWIND_3RD=3)
      INTEGER ENUM_CENTERED_4TH
      PARAMETER(ENUM_CENTERED_4TH=4)
      INTEGER ENUM_DST2
      PARAMETER(ENUM_DST2=20)
      INTEGER ENUM_FLUX_LIMIT
      PARAMETER(ENUM_FLUX_LIMIT=77)
      INTEGER ENUM_DST3
      PARAMETER(ENUM_DST3=30)
      INTEGER ENUM_DST3_FLUX_LIMIT
      PARAMETER(ENUM_DST3_FLUX_LIMIT=33)
      INTEGER ENUM_OS7MP
      PARAMETER(ENUM_OS7MP=7)
      INTEGER ENUM_SOM_PRATHER
      PARAMETER(ENUM_SOM_PRATHER=80)
      INTEGER ENUM_SOM_LIMITER
      PARAMETER(ENUM_SOM_LIMITER=81)
      INTEGER nSOM
      PARAMETER( nSOM = 3+6 )
      Real*8 oneSixth
      PARAMETER(oneSixth=1.d0/6.d0)
      INTEGER iMinAdvR, iMaxAdvR, jMinAdvR, jMaxAdvR
      PARAMETER ( iMinAdvR = 1 , iMaxAdvR = sNx )
      PARAMETER ( jMinAdvR = 1 , jMaxAdvR = sNy )
c
      INTEGER GAD_TEMPERATURE
      PARAMETER(GAD_TEMPERATURE=1)
      INTEGER GAD_SALINITY
      PARAMETER(GAD_SALINITY=2)
      INTEGER GAD_TR1
      PARAMETER(GAD_TR1=3)
      CHARACTER*2 somSfx(nSOM)
      COMMON /GAD_PARM_C/
     & somSfx
      LOGICAL tempSOM_Advection
      LOGICAL saltSOM_Advection
      LOGICAL tempMultiDimAdvec
      LOGICAL saltMultiDimAdvec
      LOGICAL AdamsBashforthGt
      LOGICAL AdamsBashforthGs
      LOGICAL AdamsBashforth_T
      LOGICAL AdamsBashforth_S
      COMMON /GAD_PARM_L/
     & tempSOM_Advection, saltSOM_Advection,
     & tempMultiDimAdvec, saltMultiDimAdvec,
     & AdamsBashforthGt, AdamsBashforthGs,
     & AdamsBashforth_T, AdamsBashforth_S
      Real*8 SmolarkiewiczMaxFrac
      COMMON /GAD_SMOL/ SmolarkiewiczMaxFrac
      COMMON /TAVE_TIME/ timeAve_half, timeAve_full
      Real*8 timeAve_half(nSx,nSy)
      Real*8 timeAve_full(nSx,nSy)
      COMMON /TAVE_STATEVARS/
     &                  uFluxtave,vFluxtave,tFluxtave,sFluxtave
     &                 ,etatave,uVeltave,vVeltave,wVeltave
     &                 ,thetatave,salttave,phiHydLowtave
     &                 ,UTtave,VTtave,WTtave,UStave,VStave,WStave
     &                 ,Eta2tave,TTtave,UUtave,VVtave,UVtave
     &                 ,TdiffRtave
     &                 ,uZetatave, vZetatave
     &                 ,phiHydtave
     &                 ,phiHydLow2Tave
     &                 ,ConvectCountTave
      Real*8  uFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  vFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sFluxtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  etatave  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVeltave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  thetatave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salttave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydLowtave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  UTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  WTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  WStave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  eta2Tave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  TTtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UUtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  VVtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  UVtave   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 TdiffRtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 uZetatave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 vZetatave (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydtave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 phiHydLow2Tave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 ConvectCountTave(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 SItoBar, SItodBar
      PARAMETER ( SItoBar  = 1.D-05 )
      PARAMETER ( SItodBar = 1.D-04 )
      COMMON /PARM_EOS_LIN/ tAlpha,sBeta,equationOfState
      Real*8 tAlpha
      Real*8 sBeta
      character*(6) equationOfState
      COMMON /PARM_EOS_NL/ eosC,eosSig0,eosRefT,eosRefS
      Real*8 eosC(9,Nr+1),eosSig0(Nr+1),eosRefT(Nr+1),eosRefS(Nr+1)
      Real*8 eosJMDCFw(6), eosJMDCSw(9)
      Real*8 eosJMDCKFw(5), eosJMDCKSw(7), eosJMDCKP(14)
      COMMON /PARM_EOS_JMD95/
     &     eosJMDCFw, eosJMDCSw, eosJMDCKFw, eosJMDCKSw, eosJMDCKP
      Real*8 eosMDJWFnum(0:11), eosMDJWFden(0:12)
      COMMON /PARM_EOS_MDJWF/ 
     &     eosMDJWFnum, eosMDJWFden
      Real*8 op5
      Real*8 op25
      PARAMETER( op5  = 0.5 D 0 )
      PARAMETER( op25 = 0.25 D 0 )
      LOGICAL GM_AdvForm
      LOGICAL GM_AdvSeparate
      LOGICAL GM_ExtraDiag
      LOGICAL GM_InMomAsStress
      LOGICAL GM_MNC
      LOGICAL GM_MDSIO
      COMMON /GM_PARAMS_L/
     &                   GM_AdvForm, GM_AdvSeparate,
     &                   GM_ExtraDiag, GM_MNC, GM_MDSIO,
     &                   GM_InMomAsStress
      CHARACTER*(40) GM_taper_scheme
      COMMON /GM_PARAMS_C/
     &                   GM_taper_scheme
      Real*8 GM_isopycK
      Real*8 GM_background_K
      Real*8 GM_maxSlope
      Real*8 GM_Kmin_horiz
      Real*8 GM_Small_Number
      Real*8 GM_slopeSqCutoff
      Real*8 GM_Visbeck_alpha
      Real*8 GM_Visbeck_length
      Real*8 GM_Visbeck_depth
      Real*8 GM_Visbeck_minDepth
      Real*8 GM_Visbeck_maxSlope
      Real*8 GM_Visbeck_minVal_K
      Real*8 GM_Visbeck_maxVal_K
      Real*8 GM_facTrL2dz
      Real*8 GM_facTrL2ML
      Real*8 GM_maxTransLay
      Real*8 GM_Scrit
      Real*8 GM_Sd
      COMMON /GM_PARAMS_R/
     &                   GM_isopycK, GM_background_K,
     &                   GM_maxSlope,
     &                   GM_Kmin_horiz,
     &                   GM_Small_Number, GM_slopeSqCutoff,
     &                   GM_Visbeck_alpha, GM_Visbeck_length,
     &                   GM_Visbeck_depth,
     &                   GM_Visbeck_minDepth, GM_Visbeck_maxSlope,
     &                   GM_Visbeck_minVal_K, GM_Visbeck_maxVal_K,
     &                   GM_facTrL2dz, GM_facTrL2ML, GM_maxTransLay,
     &                   GM_Scrit, GM_Sd
      Real*8 GM_rMaxSlope
      Real*8 GM_skewflx
      Real*8 GM_advect
      COMMON /GM_DERIVED_PAR/
     &                   GM_rMaxSlope,
     &                   GM_skewflx, GM_advect
      Real*8 Kwx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kwz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_Wtensor/ Kwx,Kwy,Kwz
      Real*8 Kux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvy(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_HorTensor/ Kux,Kvy
      Real*8 Kuz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 Kvz(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /GM_UVtensor/ Kuz,Kvz
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      Real*8 xA      (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 yA      (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uFld    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vFld    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 wFld    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 uTrans  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 vTrans  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rTrans  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 rTransKp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 maskUp  (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      Real*8 fVerT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
      Real*8 fVerS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
      Real*8 kappaRT (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 kappaRS (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
      Real*8 kappaRk (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
      INTEGER iMin, iMax
      INTEGER jMin, jMax
      INTEGER bi, bj
      INTEGER i, j
      INTEGER k, km1, kup, kDown
      LOGICAL useVariableK
         IF ( debugLevel .GE. debLevB )
     &    CALL DEBUG_ENTER('THERMODYNAMICS',myThid)
      ikey = 1
      itdkey = 1
CHPF$ INDEPENDENT
      TsurfCor = 0.d0
      SsurfCor = 0.d0
      IF (linFSConserveTr) THEN
CADJ STORE theta,salt,wvel = comlev1, key = ikey_dynamics, byte=isbyte
       CALL CALC_WSURF_TR(theta,salt,wVel,
     &                    myTime,myIter,myThid)
      ENDIF
      DO bj=myByLo(myThid),myByHi(myThid)
CHPF$  INDEPENDENT, NEW (rTrans,fVerT,fVerS
CHPF$&                  ,utrans,vtrans,xA,yA
CHPF$&                  ,kappaRT,kappaRS
CHPF$&                  )
       DO bi=myBxLo(myThid),myBxHi(myThid)
          act1 = bi - myBxLo(myThid)
          max1 = myBxHi(myThid) - myBxLo(myThid) + 1
          act2 = bj - myByLo(myThid)
          max2 = myByHi(myThid) - myByLo(myThid) + 1
          act3 = myThid - 1
          max3 = nTx*nTy
          act4 = ikey_dynamics - 1
          itdkey = (act1 + 1) + act2*max1
     &                      + act3*max1*max2
     &                      + act4*max1*max2*max3
        DO j=1-OLy,sNy+OLy
         DO i=1-OLx,sNx+OLx
          xA(i,j)        = 0.d0
          yA(i,j)        = 0.d0
          uTrans(i,j)    = 0.d0
          vTrans(i,j)    = 0.d0
          rTrans (i,j)   = 0.d0
          rTransKp1(i,j) = 0.d0
          fVerT  (i,j,1) = 0.d0
          fVerT  (i,j,2) = 0.d0
          fVerS  (i,j,1) = 0.d0
          fVerS  (i,j,2) = 0.d0
          kappaRT(i,j)   = 0.d0
          kappaRS(i,j)   = 0.d0
         ENDDO
        ENDDO
        DO k=1,Nr
         DO j=1-OLy,sNy+OLy
          DO i=1-OLx,sNx+OLx
           kappaRk(i,j,k)    = 0.d0
           gT(i,j,k,bi,bj)   = 0.d0
           gS(i,j,k,bi,bj)   = 0.d0
          ENDDO
         ENDDO
        ENDDO
CADJ STORE wvel (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
CADJ STORE salt (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
CADJ STORE uvel (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
CADJ STORE vvel (:,:,:,bi,bj) = comlev1_bibj, key=itdkey, byte=isbyte
C
        IF (tempMultiDimAdvec) THEN
          IF ( debugLevel .GE. debLevB )
     &     CALL DEBUG_CALL('GAD_ADVECTION',myThid)
          CALL GAD_ADVECTION(
     I             tempImplVertAdv, tempAdvScheme, tempVertAdvScheme,
     I             GAD_TEMPERATURE, dTtracerLev,
     I             uVel, vVel, wVel, theta,
     O             gT,
     I             bi,bj,myTime,myIter,myThid)
        ENDIF
        IF (saltMultiDimAdvec) THEN
          IF ( debugLevel .GE. debLevB )
     &     CALL DEBUG_CALL('GAD_ADVECTION',myThid)
          CALL GAD_ADVECTION(
     I             saltImplVertAdv, saltAdvScheme, saltVertAdvScheme,
     I             GAD_SALINITY, dTtracerLev,
     I             uVel, vVel, wVel, salt,
     O             gS,
     I             bi,bj,myTime,myIter,myThid)
        ENDIF
        IF ( debugLevel .GE. debLevB )
     &    CALL DEBUG_MSG('ENTERING DOWNWARD K LOOP',myThid)
        DO k=Nr,1,-1
C? Patrick Is this formula correct?
         kkey = (itdkey-1)*Nr + k
          km1  = MAX(1,k-1)
          kup  = 1+MOD(k+1,2)
          kDown= 1+MOD(k,2)
          iMin = 1-OLx
          iMax = sNx+OLx
          jMin = 1-OLy
          jMax = sNy+OLy
          IF (k.EQ.Nr) THEN
           DO j=1-Oly,sNy+Oly
            DO i=1-Olx,sNx+Olx
             rTransKp1(i,j) = 0.d0
            ENDDO
           ENDDO
          ELSE
           DO j=1-Oly,sNy+Oly
            DO i=1-Olx,sNx+Olx
             rTransKp1(i,j) = rTrans(i,j)
            ENDDO
           ENDDO
          ENDIF
CADJ STORE rTransKp1(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
          CALL CALC_COMMON_FACTORS (
     I         uVel, vVel,
     O         uFld, vFld, uTrans, vTrans, xA, yA,
     I         k,bi,bj, myThid )
          IF (k.EQ.1) THEN
           DO j=1-Oly,sNy+Oly
            DO i=1-Olx,sNx+Olx
             wFld(i,j)   = 0.d0
             maskUp(i,j) = 0.d0
             rTrans(i,j) = 0.d0
            ENDDO
           ENDDO
          ELSE
           DO j=1-Oly,sNy+Oly
            DO i=1-Olx,sNx+Olx
             wFld(i,j)   = wVel(i,j,k,bi,bj)
             maskUp(i,j) = maskC(i,j,k-1,bi,bj)*maskC(i,j,k,bi,bj)
             rTrans(i,j) = wFld(i,j)*rA(i,j,bi,bj)*maskUp(i,j)
     &                              *deepFac2F(k)*rhoFacF(k)
            ENDDO
           ENDDO
          ENDIF
          IF (useGMRedi) THEN
            CALL GMREDI_CALC_UVFLOW(
     U                  uFld, vFld, uTrans, vTrans,
     I                  k, bi, bj, myThid )
            IF (K.GE.2) THEN
              CALL GMREDI_CALC_WFLOW(
     U                  wFld, rTrans,
     I                  k, bi, bj, myThid )
            ENDIF
          ENDIF
CADJ STORE rTrans(:,:)    = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE wfld(:,:)      = comlev1_bibj_k, key=kkey, byte=isbyte
          IF ( .NOT.implicitDiffusion ) THEN
            CALL CALC_DIFFUSIVITY(
     I          bi,bj,iMin,iMax,jMin,jMax,k,
     I          maskUp,
     O          kappaRT,kappaRS,
     I          myThid)
          ENDIF
CADJ STORE kappaRT(:,:)    = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE kappaRS(:,:)    = comlev1_bibj_k, key=kkey, byte=isbyte
          iMin = 1-OLx+2
          iMax = sNx+OLx-1
          jMin = 1-OLy+2
          jMax = sNy+OLy-1
C
C
         IF ( tempStepping ) THEN
CADJ STORE gTnm1(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
          CALL CALC_GT(
     I         bi,bj,iMin,iMax,jMin,jMax, k,km1,kup,kDown,
     I         xA, yA, maskUp, uFld, vFld, wFld,
     I         uTrans, vTrans, rTrans, rTransKp1,
     I         kappaRT,
     U         fVerT,
     I         myTime,myIter,myThid)
           CALL TIMESTEP_TRACER(
     I         bi,bj,iMin,iMax,jMin,jMax,k,tempAdvScheme,dTtracerLev(k),
     I         theta,
     U         gT,
     I         myIter, myThid)
         ENDIF
         IF ( saltStepping ) THEN
CADJ STORE gSnm1(:,:,k,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte
          CALL CALC_GS(
     I         bi,bj,iMin,iMax,jMin,jMax, k,km1,kup,kDown,
     I         xA, yA, maskUp, uFld, vFld, wFld,
     I         uTrans, vTrans, rTrans, rTransKp1,
     I         kappaRS,
     U         fVerS,
     I         myTime,myIter,myThid)
           CALL TIMESTEP_TRACER(
     I         bi,bj,iMin,iMax,jMin,jMax,k,saltAdvScheme,dTtracerLev(k),
     I         salt,
     U         gS,
     I         myIter, myThid)
         ENDIF
         IF ( useOldFreezing .AND. .NOT. useSEAICE
     &       .AND. .NOT.(useThSIce.AND.k.EQ.1) ) THEN
CADJ STORE gT(:,:,k,bi,bj) = comlev1_bibj_k
CADJ &   , key = kkey, byte = isbyte
            CALL FREEZE( bi, bj, iMin, iMax, jMin, jMax, k, myThid )
         ENDIF
        ENDDO
        iMin = 1
        iMax = sNx
        jMin = 1
        jMax = sNy
        IF ( tempStepping .AND. implicitDiffusion ) THEN
          CALL CALC_3D_DIFFUSIVITY(
     I         bi,bj,iMin,iMax,jMin,jMax,
     I         GAD_TEMPERATURE, useGMredi, useKPP,
     O         kappaRk,
     I         myThid)
        ENDIF
        IF     ( tempStepping .AND. implicitDiffusion ) THEN
CADJ STORE kappaRk(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte
CADJ STORE gT(:,:,:,bi,bj) = comlev1_bibj , key=itdkey, byte=isbyte
          CALL IMPLDIFF(
     I         bi, bj, iMin, iMax, jMin, jMax,
     I         GAD_TEMPERATURE, kappaRk, recip_hFacC,
     U         gT,
     I         myThid )
        ENDIF
        useVariableK = useKPP .OR. usePP81 .OR. useMY82 .OR. useGGL90
     &       .OR. useGMredi .OR. ivdc_kappa.NE.0.
        IF (taveFreq.GT.0. .AND. useVariableK ) THEN
         IF (implicitDiffusion) THEN
           CALL TIMEAVE_CUMUL_DIF_1T(TdiffRtave, gT, kappaRk,
     I                        Nr, 3, deltaTclock, bi, bj, myThid)
         ENDIF
        ENDIF
        IF ( saltStepping .AND. implicitDiffusion ) THEN
          CALL CALC_3D_DIFFUSIVITY(
     I         bi,bj,iMin,iMax,jMin,jMax,
     I         GAD_SALINITY, useGMredi, useKPP,
     O         kappaRk,
     I         myThid)
        ENDIF
        IF     ( saltStepping .AND. implicitDiffusion ) THEN
CADJ STORE kappaRk(:,:,:) = comlev1_bibj , key=itdkey, byte=isbyte
CADJ STORE gS(:,:,:,bi,bj) = comlev1_bibj , key=itdkey, byte=isbyte
          CALL IMPLDIFF(
     I         bi, bj, iMin, iMax, jMin, jMax,
     I         GAD_SALINITY, kappaRk, recip_hFacC,
     U         gS,
     I         myThid )
        ENDIF
       ENDDO
      ENDDO
      If (debugMode) THEN
       CALL DEBUG_STATS_RL(Nr,uVel,'Uvel (THERMODYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,vVel,'Vvel (THERMODYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,wVel,'Wvel (THERMODYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,theta,'Theta (THERMODYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,salt,'Salt (THERMODYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,gT,'Gt (THERMODYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,gS,'Gs (THERMODYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,gtNm1,'GtNm1 (THERMODYNAMICS)',myThid)
       CALL DEBUG_STATS_RL(Nr,gsNm1,'GsNm1 (THERMODYNAMICS)',myThid)
      ENDIF
         IF ( debugLevel .GE. debLevB )
     &    CALL DEBUG_LEAVE('THERMODYNAMICS',myThid)
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE TIMESTEP_TRACER(
     I                     bi, bj, iMin, iMax, jMin, jMax, K,
     I                     advection_scheme, deltaTloc,
     I                     tracer, gTracer,
     I                     myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      INTEGER bi,bj,iMin,iMax,jMin,jMax,K
      INTEGER advection_scheme
      Real*8     deltaTloc
      Real*8  tracer (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gTracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      INTEGER myIter, myThid
      INTEGER i,j
      DO j=jMin,jMax
       DO i=iMin,iMax
         gTracer(i,j,k,bi,bj)=tracer(i,j,k,bi,bj)
     &            +deltaTloc*gTracer(i,j,k,bi,bj)
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE TRACERS_CORRECTION_STEP(myTime, myIter, myThid)
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      INTEGER iMin,iMax
      INTEGER jMin,jMax
      INTEGER bi,bj
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
        IF (tempStepping)
     &      CALL CYCLE_TRACER(
     I           bi,bj,
     U           theta,gT,
     I           myTime,myIter,myThid )
        IF (saltStepping)
     &      CALL CYCLE_TRACER(
     I           bi,bj,
     U           salt,gS,
     I           myTime,myIter,myThid )
       ENDDO
      ENDDO
C
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
        iMin = 1
        iMax = sNx
        jMin = 1
        jMax = sNy
        IF ( cAdjFreq .NE. 0. ) THEN
         CALL CONVECTIVE_ADJUSTMENT(
     I        bi, bj, myTime, myIter, myThid )
        ENDIF
       ENDDO
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE UPDATE_CG2D( myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /CG2D_I_L/ cg2dNormaliseRHS
      LOGICAL cg2dNormaliseRHS
      COMMON /CG2D_I_R/
     &      aW2d, aS2d, aC2d,
     &      pW, pS, pC,
     &      cg2dNorm, cg2dTolerance
      Real*8  aW2d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  aS2d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  aC2d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pW   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pC   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  cg2dNorm, cg2dTolerance
      COMMON /CG2D_I_WK_R/
     & cg2d_q, cg2d_r, cg2d_s
      Real*8  cg2d_q(1-1:sNx+1,1-1:sNy+1,nSx,nSy)
      Real*8  cg2d_r(1-1:sNx+1,1-1:sNy+1,nSx,nSy)
      Real*8  cg2d_s(1-1:sNx+1,1-1:sNy+1,nSx,nSy)
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE UPDATE_ETAH( myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
      COMMON /DYNVARS_R/
     &                   etaN,
     &                   uVel,vVel,wVel,theta,salt,
     &                   gU,   gV,   gT,   gS,
     &                   guNm1,gvNm1,gtNm1,gsNm1
      Real*8  etaN  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  wVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  theta(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  guNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gvNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gtNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  gsNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      COMMON /DYNVARS_R_2/
     &                   etaH
      Real*8  etaH  (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /DYNVARS_DIAG/
     &                       phiHydLow, totPhiHyd,
     &                       rhoInSitu,
     &                       hMixLayer, IVDConvCount
      Real*8  phiHydLow(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  totPhiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  rhoInSitu(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8  hMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  IVDConvCount(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
C
C
C
C
C
C
C
C
C
      COMMON /FFIELDS_fu/ fu
      COMMON /FFIELDS_fv/ fv
      COMMON /FFIELDS_Qnet/ Qnet
      COMMON /FFIELDS_Qsw/ Qsw
      COMMON /FFIELDS_dQdT/ dQdT
      COMMON /FFIELDS_EmPmR/ EmPmR
      COMMON /FFIELDS_saltFlux/ saltFlux
      COMMON /FFIELDS_SST/ SST
      COMMON /FFIELDS_SSS/ SSS
      COMMON /FFIELDS_lambdaThetaClimRelax/ lambdaThetaClimRelax
      COMMON /FFIELDS_lambdaSaltClimRelax/ lambdaSaltClimRelax
      COMMON /FFIELDS_pLoad/ pLoad
      COMMON /FFIELDS_sIceLoad/ sIceLoad
      Real*8  fu       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  fv       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qsw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  dQdT     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaThetaClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  lambdaSaltClimRelax(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  pLoad    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  sIceLoad (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /Mean_qnet/ Qnetm
      Real*8  Qnetm   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /TDFIELDS/
     &                 taux0, tauy0, Qnet0, EmPmR0, SST0, SSS0,
     &                 taux1, tauy1, Qnet1, EmPmR1, SST1, SSS1,
     &                 saltFlux0, saltFlux1
      Real*8  taux0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet0    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR0   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS0     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  taux1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  tauy1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  Qnet1    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  EmPmR1   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  saltFlux1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SST1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  SSS1     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
C
      COMMON /SURFACE_FORCING/
     &                         surfaceForcingU,
     &                         surfaceForcingV,
     &                         surfaceForcingT,
     &                         surfaceForcingS,
     &                         surfaceForcingTice
      Real*8  surfaceForcingU   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingV   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingT   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingS   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  surfaceForcingTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      INTEGER i,j,bi,bj
      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
         DO j=1-Oly,sNy+Oly
           DO i=1-Olx,sNx+Olx
             etaHnm1(i,j,bi,bj) = etaH(i,j,bi,bj)
           ENDDO
         ENDDO
        IF (implicDiv2Dflow.EQ. 1.d0) THEN
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
            etaH(i,j,bi,bj) = etaN(i,j,bi,bj)
          ENDDO
         ENDDO
        ELSE
         DO j=1,sNy
          DO i=1,sNx
            etaH(i,j,bi,bj) = etaN(i,j,bi,bj)
     &       + (1. - implicDiv2Dflow)*dEtaHdt(i,j,bi,bj)
     &                               *deltaTfreesurf
          ENDDO
         ENDDO
        ENDIF
       ENDDO
      ENDDO
      IF (implicDiv2Dflow .NE. 1.d0 .OR. useOBCS )
     &    CALL EXCH_XY_RL( etaH, myThid )
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE UPDATE_MASKS_ETC( myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
c
c
c
c
      character*(5)  lsoptversion
      parameter    ( lsoptversion = '2.1.0' )
      character*(5)  offlineversion
      parameter    ( offlineversion = '0.1.1' )
c
c
      common /optiparm_i/
     &                    optimcycle,
     &                    nvars,
     &                    numiter,
     &                    nfunc,
     &                    iprint,
     &                    nupdate
      integer optimcycle
      integer nvars
      integer numiter
      integer nfunc
      integer iprint
      integer nupdate
      common /optiparm_r/
     &                    fmin,
     &                    epsf,
     &                    epsx,
     &                    epsg,
     &                    eps
      Real*8 epsf
      Real*8 epsx
      Real*8 fmin
      Real*8 epsg
      Real*8 eps
      common /optiparm_l/
     &                    nondimcontrol
      logical nondimcontrol
      common /optiparm_c/
     &                    copt
      character*( 3) copt
      INTEGER myThid
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE UPDATE_SURF_DR( myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE SWFRAC(
     I                  imax, fact,
     U                  swdk,
     I                  myTime, myIter, myThid )
      IMPLICIT NONE
      INTEGER imax
      Real*8     fact
      Real*8     myTime
      INTEGER myIter
      INTEGER myThid
      Real*8     swdk(imax)
      INTEGER   nwtype  , jwtype
      PARAMETER(nwtype=5)
      Real*8 facz
      Real*8 rfac(nwtype),a1(nwtype),a2(nwtype)
      INTEGER i
      DATA rfac / 0.58d0, 0.62d0, 0.67d0, 0.77d0, 0.78d0/
      DATA a1   / 0.35d0, 0.6d0, 1.0d0, 1.5d0, 1.4d0/
      DATA a2   / 23.0d0, 20.0d0, 17.0d0, 14.0d0, 7.9d0/
      jwtype=2
      DO i = 1,imax
        facz = fact*swdk(i)
        IF ( facz .LT. -200.d0 ) THEN
          swdk(i) = 0.d0
        ELSE
          swdk(i) =       rfac(jwtype)  * exp( facz/a1(jwtype) )
     &       + (1.d0 - rfac(jwtype)) * exp( facz/a2(jwtype) )
        ENDIF
      ENDDO
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE CALC_R_STAR( etaFld,
     I                        myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      Real*8 etaFld(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      RETURN
      END
C
C
C
C
C
C
C
C
C
C
CPH >>>>>> THERE ARE NO MORE CAL OPTIONS TO BE SET <<<<<<
      SUBROUTINE UPDATE_R_STAR( myTime, myIter, myThid )
      IMPLICIT NONE
C
      INTEGER sNx
      INTEGER sNy
      INTEGER OLx
      INTEGER OLy
      INTEGER nSx
      INTEGER nSy
      INTEGER nPx
      INTEGER nPy
      INTEGER Nx
      INTEGER Ny
      INTEGER Nr
      PARAMETER (
     &           sNx =  45,
     &           sNy =  20,
     &           OLx =   2,
     &           OLy =   2,
     &           nSx =   2,
     &           nSy =   2,
     &           nPx =   1,
     &           nPy =   1,
     &           Nx  = sNx*nSx*nPx,
     &           Ny  = sNy*nSy*nPy,
     &           Nr  =  15)
      INTEGER MAX_OLX
      INTEGER MAX_OLY
      PARAMETER ( MAX_OLX = OLx,
     &            MAX_OLY = OLy )
      integer     nobcs
      parameter ( nobcs = 4 )
C
      INTEGER MAX_LEN_MBUF
      PARAMETER ( MAX_LEN_MBUF = 512 )
      INTEGER MAX_LEN_FNAM
      PARAMETER ( MAX_LEN_FNAM = 512 )
      INTEGER MAX_LEN_PREC
      PARAMETER ( MAX_LEN_PREC = 200 )
      INTEGER MAX_NO_THREADS
      PARAMETER ( MAX_NO_THREADS =  4 )
      INTEGER MAX_NO_PROCS
      PARAMETER ( MAX_NO_PROCS   =  4096 )
      INTEGER MAX_NO_BARRIERS
      PARAMETER ( MAX_NO_BARRIERS = 1 )
      INTEGER cacheLineSize
      INTEGER lShare1
      INTEGER lShare4
      INTEGER lShare8
      PARAMETER ( cacheLineSize = 256 )
      PARAMETER ( lShare1 =  cacheLineSize )
      PARAMETER ( lShare4 =  cacheLineSize/4 )
      PARAMETER ( lShare8 =  cacheLineSize/8 )
      INTEGER MAX_VGS
      PARAMETER ( MAX_VGS = 8192 )
      INTEGER precFloat32
      PARAMETER ( precFloat32 = 32 )
      INTEGER precFloat64
      PARAMETER ( precFloat64 = 64 )
      Real*8  UNSET_FLOAT8
      PARAMETER ( UNSET_FLOAT8 = 1.234567D5 )
      Real*4  UNSET_FLOAT4
      PARAMETER ( UNSET_FLOAT4 = 1.234567E5 )
      Real*8     UNSET_RL
      PARAMETER ( UNSET_RL     = 1.234567D5 )
      Real*8     UNSET_RS
      PARAMETER ( UNSET_RS     = 1.234567D5 )
      INTEGER UNSET_I
      PARAMETER ( UNSET_I      = 123456789  )
      INTEGER debLevZero
      PARAMETER ( debLevZero=0 )
      INTEGER debLevA
      PARAMETER ( debLevA=1 )
      INTEGER debLevB
      PARAMETER ( debLevB=2 )
      CHARACTER*(*) SQUEEZE_RIGHT
      PARAMETER ( SQUEEZE_RIGHT = 'R' )
      CHARACTER*(*) SQUEEZE_LEFT
      PARAMETER ( SQUEEZE_LEFT = 'L' )
      CHARACTER*(*) SQUEEZE_BOTH
      PARAMETER ( SQUEEZE_BOTH = 'B' )
      CHARACTER*(*) PRINT_MAP_XY
      PARAMETER ( PRINT_MAP_XY = 'XY' )
      CHARACTER*(*) PRINT_MAP_XZ
      PARAMETER ( PRINT_MAP_XZ = 'XZ' )
      CHARACTER*(*) PRINT_MAP_YZ
      PARAMETER ( PRINT_MAP_YZ = 'YZ' )
      CHARACTER*(*) commentCharacter
      PARAMETER ( commentCharacter = '#' )
      INTEGER INDEX_I
      INTEGER INDEX_J
      INTEGER INDEX_K
      INTEGER INDEX_NONE
      PARAMETER ( INDEX_I    = 1,
     &            INDEX_J    = 2,
     &            INDEX_K    = 3,
     &            INDEX_NONE = 4 )
      INTEGER EXCH_IGNORE_CORNERS
      INTEGER EXCH_UPDATE_CORNERS
      PARAMETER ( EXCH_IGNORE_CORNERS = 0,
     &            EXCH_UPDATE_CORNERS = 1 )
      INTEGER FORWARD_SIMULATION
      INTEGER REVERSE_SIMULATION
      INTEGER TANGENT_SIMULATION
      PARAMETER ( FORWARD_SIMULATION = 0,
     &            REVERSE_SIMULATION = 1,
     &            TANGENT_SIMULATION = 2 )
      COMMON /EEPARAMS_L/
     &  eeBootError, fatalError, eeEndError,
     &  useSingleCpuIO, printMapIncludesZeros,
     &  useCubedSphereExchange, useCoupler,
     &  useNEST_PARENT, useNEST_CHILD, useOASIS,
     &  useSETRLSTK, useSIGREG
      LOGICAL eeBootError
      LOGICAL eeEndError
      LOGICAL fatalError
      LOGICAL useSingleCpuIO
      LOGICAL printMapIncludesZeros
      LOGICAL useCubedSphereExchange
      LOGICAL useCoupler
      LOGICAL useNEST_PARENT
      LOGICAL useNEST_CHILD
      LOGICAL useOASIS
      LOGICAL useSETRLSTK
      LOGICAL useSIGREG
      COMMON /EEPARAMS_I/
     &  errorMessageUnit, standardMessageUnit, maxLengthPrt1D,
     &  scrUnit1, scrUnit2, eeDataUnit, modelDataUnit,
     &  numberOfProcs, pidIO, myProcId,
     &  myPx, myPy, myXGlobalLo, myYGlobalLo, nThreads,
     &  myBxLo, myBxHi, myByLo, myByHi,
     &  nTx, nTy, ioErrorCount
      INTEGER errorMessageUnit
      INTEGER standardMessageUnit
      INTEGER maxLengthPrt1D
      INTEGER scrUnit1
      INTEGER scrUnit2
      INTEGER eeDataUnit
      INTEGER modelDataUnit
      INTEGER ioErrorCount(MAX_NO_THREADS)
      INTEGER myBxLo(MAX_NO_THREADS)
      INTEGER myBxHi(MAX_NO_THREADS)
      INTEGER myByLo(MAX_NO_THREADS)
      INTEGER myByHi(MAX_NO_THREADS)
      INTEGER myProcId
      INTEGER myPx
      INTEGER myPy
      INTEGER myXGlobalLo
      INTEGER myYGlobalLo
      INTEGER nThreads
      INTEGER nTx
      INTEGER nTy
      INTEGER numberOfProcs
      INTEGER pidIO
C
C
C
      Real*8 PI
      PARAMETER ( PI    = 3.14159265358979323844d0   )
      Real*8 deg2rad
      PARAMETER ( deg2rad = 2.d0*PI/360.d0           )
      COMMON /PARM_C/
     &                buoyancyRelation, eosType,
     &                pickupSuff, mdsioLocalDir,
     &                tRefFile, sRefFile, rhoRefFile,
     &                delRFile, delRcFile, hybSigmFile,
     &                delXFile, delYFile, horizGridFile,
     &                bathyFile, topoFile,
     &                viscAhDfile, viscAhZfile,
     &                viscA4Dfile, viscA4Zfile,
     &                hydrogThetaFile, hydrogSaltFile, diffKrFile,
     &                zonalWindFile, meridWindFile, thetaClimFile,
     &                saltClimFile,
     &                EmPmRfile, saltFluxFile,
     &                surfQfile, surfQnetFile, surfQswFile,
     &                lambdaThetaFile, lambdaSaltFile,
     &                uVelInitFile, vVelInitFile, pSurfInitFile,
     &                dQdTfile, ploadFile,
     &                eddyPsiXFile, eddyPsiYFile,
     &                the_run_name
      CHARACTER*(MAX_LEN_FNAM) buoyancyRelation
      CHARACTER*(6)  eosType
      CHARACTER*(10) pickupSuff
      CHARACTER*(MAX_LEN_FNAM) mdsioLocalDir
      CHARACTER*(MAX_LEN_FNAM) tRefFile
      CHARACTER*(MAX_LEN_FNAM) sRefFile
      CHARACTER*(MAX_LEN_FNAM) rhoRefFile
      CHARACTER*(MAX_LEN_FNAM) delRFile
      CHARACTER*(MAX_LEN_FNAM) delRcFile
      CHARACTER*(MAX_LEN_FNAM) hybSigmFile
      CHARACTER*(MAX_LEN_FNAM) delXFile
      CHARACTER*(MAX_LEN_FNAM) delYFile
      CHARACTER*(MAX_LEN_FNAM) horizGridFile
      CHARACTER*(MAX_LEN_FNAM) bathyFile, topoFile
      CHARACTER*(MAX_LEN_FNAM) hydrogThetaFile, hydrogSaltFile
      CHARACTER*(MAX_LEN_FNAM) diffKrFile
      CHARACTER*(MAX_LEN_FNAM) viscAhDfile
      CHARACTER*(MAX_LEN_FNAM) viscAhZfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Dfile
      CHARACTER*(MAX_LEN_FNAM) viscA4Zfile
      CHARACTER*(MAX_LEN_FNAM) zonalWindFile
      CHARACTER*(MAX_LEN_FNAM) meridWindFile
      CHARACTER*(MAX_LEN_FNAM) thetaClimFile
      CHARACTER*(MAX_LEN_FNAM) saltClimFile
      CHARACTER*(MAX_LEN_FNAM) surfQfile
      CHARACTER*(MAX_LEN_FNAM) surfQnetFile
      CHARACTER*(MAX_LEN_FNAM) surfQswFile
      CHARACTER*(MAX_LEN_FNAM) EmPmRfile
      CHARACTER*(MAX_LEN_FNAM) saltFluxFile
      CHARACTER*(MAX_LEN_FNAM) uVelInitFile
      CHARACTER*(MAX_LEN_FNAM) vVelInitFile
      CHARACTER*(MAX_LEN_FNAM) pSurfInitFile
      CHARACTER*(MAX_LEN_FNAM) dQdTfile
      CHARACTER*(MAX_LEN_FNAM) ploadFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiXFile
      CHARACTER*(MAX_LEN_FNAM) eddyPsiYFile
      CHARACTER*(MAX_LEN_FNAM) lambdaThetaFile
      CHARACTER*(MAX_LEN_FNAM) lambdaSaltFile
      CHARACTER*(MAX_LEN_PREC/2) the_run_name
      COMMON /PARM_I/
     &        cg2dMaxIters,
     &        cg2dChkResFreq, cg2dPreCondFreq,
     &        cg3dMaxIters,
     &        cg3dChkResFreq,
     &        nIter0, nTimeSteps, nEndIter,
     &        writeStatePrec,
     &        writeBinaryPrec, readBinaryPrec,
     &        nonlinFreeSurf, select_rStar,
     &        selectNHfreeSurf,
     &        selectSigmaCoord,
     &        selectAddFluid,
     &        momForcingOutAB, tracForcingOutAB,
     &        tempAdvScheme, tempVertAdvScheme,
     &        saltAdvScheme, saltVertAdvScheme,
     &        selectKEscheme, selectVortScheme,
     &        monitorSelect, debugLevel
      INTEGER cg2dMaxIters
      INTEGER cg2dChkResFreq
      INTEGER cg2dPreCondFreq
      INTEGER cg3dMaxIters
      INTEGER cg3dChkResFreq
      INTEGER nIter0
      INTEGER nTimeSteps
      INTEGER nEndIter
      INTEGER writeStatePrec
      INTEGER writeBinaryPrec
      INTEGER readBinaryPrec
      INTEGER nonlinFreeSurf
      INTEGER select_rStar
      INTEGER selectNHfreeSurf
      INTEGER selectSigmaCoord
      INTEGER selectAddFluid
      INTEGER momForcingOutAB, tracForcingOutAB
      INTEGER tempAdvScheme, tempVertAdvScheme
      INTEGER saltAdvScheme, saltVertAdvScheme
      INTEGER selectKEscheme
      INTEGER selectVortScheme
      INTEGER monitorSelect
      INTEGER debugLevel
      COMMON /PARM_L/
     & fluidIsAir, fluidIsWater,
     & usingPCoords, usingZCoords, useDynP_inEos_Zc,
     & usingCartesianGrid, usingSphericalPolarGrid, rotateGrid,
     & usingCurvilinearGrid, usingCylindricalGrid,
     & deepAtmosphere, setInterFDr, setCenterDr,
     & no_slip_sides, no_slip_bottom,
     & useFullLeith, useStrainTensionVisc, useAreaViscLength,
     & momViscosity, momAdvection, momForcing,
     & momPressureForcing, metricTerms, useNHMTerms,
     & useCoriolis, use3dCoriolis,
     & useConstantF, useBetaPlaneF, useSphereF,
     & useCDscheme, vectorInvariantMomentum,
     & useEnergyConservingCoriolis, useJamartWetPoints, useJamartMomAdv,
     & upwindVorticity, highOrderVorticity,
     & useAbsVorticity, upwindShear,
     & momStepping, tempStepping, saltStepping,
     & tempAdvection, tempIsActiveTr, tempForcing,
     & saltAdvection, saltIsActiveTr, saltForcing,
     & maskIniTemp, maskIniSalt, checkIniTemp, checkIniSalt,
     & useRealFreshWaterFlux,
     & rigidLid, implicitFreeSurface, exactConserv, linFSConserveTr,
     & uniformLin_PhiSurf,
     & quasiHydrostatic, nonHydrostatic,
     & use3Dsolver, implicitIntGravWave, staggerTimeStep,
     & implicitDiffusion, implicitViscosity,
     & tempImplVertAdv, saltImplVertAdv, momImplVertAdv,
     & multiDimAdvection, useMultiDimAdvec,
     & momDissip_In_AB, doAB_onGtGs,
     & balanceEmPmR, balanceQnet, balancePrintMean,
     & doThetaClimRelax, doSaltClimRelax,
     & allowFreezing, useOldFreezing,
     & periodicExternalForcing,
     & globalFiles,
     & pickupStrictlyMatch, usePickupBeforeC54, startFromPickupAB2,
     & pickup_read_mdsio, pickup_write_mdsio, pickup_write_immed,
     & writePickupAtEnd,
     & timeave_mdsio, snapshot_mdsio, monitor_stdio,
     & outputTypesInclusive, dumpInitAndLast, debugMode,
     & inAdMode, inAdTrue, inAdFalse, inAdExact,
     & useSRCGSolver
      LOGICAL fluidIsAir
      LOGICAL fluidIsWater
      LOGICAL usingPCoords
      LOGICAL usingZCoords
      LOGICAL useDynP_inEos_Zc
      LOGICAL usingCartesianGrid
      LOGICAL usingSphericalPolarGrid, rotateGrid
      LOGICAL usingCylindricalGrid
      LOGICAL usingCurvilinearGrid
      LOGICAL deepAtmosphere
      LOGICAL setInterFDr
      LOGICAL setCenterDr
      LOGICAL useNHMTerms
      LOGICAL no_slip_sides
      LOGICAL no_slip_bottom
      LOGICAL momViscosity
      LOGICAL momAdvection
      LOGICAL momForcing
      LOGICAL momPressureForcing
      LOGICAL useCoriolis
      LOGICAL vectorInvariantMomentum
      LOGICAL tempAdvection
      LOGICAL tempIsActiveTr
      LOGICAL tempForcing
      LOGICAL saltAdvection
      LOGICAL saltIsActiveTr
      LOGICAL saltForcing
      LOGICAL maskIniTemp
      LOGICAL maskIniSalt
      LOGICAL checkIniTemp
      LOGICAL checkIniSalt
      LOGICAL useRealFreshWaterFlux
      LOGICAL useFullLeith
      LOGICAL useStrainTensionVisc
      LOGICAL useAreaViscLength
      LOGICAL rigidLid
      LOGICAL implicitFreeSurface
      LOGICAL exactConserv
      LOGICAL linFSConserveTr
      LOGICAL uniformLin_PhiSurf
      LOGICAL quasiHydrostatic
      LOGICAL nonHydrostatic
      LOGICAL use3Dsolver
      LOGICAL implicitIntGravWave
      LOGICAL staggerTimeStep
      LOGICAL momStepping
      LOGICAL tempStepping
      LOGICAL saltStepping
      LOGICAL metricTerms
      LOGICAL useConstantF
      LOGICAL useBetaPlaneF
      LOGICAL useSphereF
      LOGICAL use3dCoriolis
      LOGICAL useCDscheme
      LOGICAL useEnergyConservingCoriolis
      LOGICAL useJamartWetPoints
      LOGICAL useJamartMomAdv
      LOGICAL upwindVorticity
      LOGICAL highOrderVorticity
      LOGICAL useAbsVorticity
      LOGICAL upwindShear
      LOGICAL implicitDiffusion
      LOGICAL implicitViscosity
      LOGICAL tempImplVertAdv
      LOGICAL saltImplVertAdv
      LOGICAL momImplVertAdv
      LOGICAL multiDimAdvection
      LOGICAL useMultiDimAdvec
      LOGICAL momDissip_In_AB
      LOGICAL doAB_onGtGs
      LOGICAL balanceEmPmR
      LOGICAL balanceQnet
      LOGICAL balancePrintMean
      LOGICAL doThetaClimRelax
      LOGICAL doSaltClimRelax
      LOGICAL allowFreezing
      LOGICAL useOldFreezing
      LOGICAL periodicExternalForcing
      LOGICAL globalFiles
      LOGICAL pickupStrictlyMatch
      LOGICAL usePickupBeforeC54
      LOGICAL startFromPickupAB2
      LOGICAL pickup_read_mdsio, pickup_write_mdsio
      LOGICAL pickup_write_immed, writePickupAtEnd
      LOGICAL timeave_mdsio, snapshot_mdsio, monitor_stdio
      LOGICAL outputTypesInclusive
      LOGICAL dumpInitAndLast
      LOGICAL debugMode
      LOGICAL inAdMode, inAdTrue, inAdFalse, inAdExact
      LOGICAL useSRCGSolver
C
      COMMON /PARM_R/ cg2dTargetResidual, cg2dTargetResWunit,
     & cg2dpcOffDFac, cg3dTargetResidual,
     & delR, delRc, delX, delY,
     & deltaT, deltaTmom, dTtracerLev, deltaTfreesurf, deltaTClock,
     & abEps, alph_AB, beta_AB,
     & xgOrigin, ygOrigin, rSphere, recip_RSphere, f0, beta,
     & viscFacAdj, viscAh, viscAhW, viscAhMax,
     & viscAhGrid, viscAhGridMax, viscAhGridMin,
     & viscC2leith, viscC2leithD,
     & viscC2smag, viscC4smag,
     & viscAhD, viscAhZ, viscA4D, viscA4Z,
     & viscA4, viscA4W, viscA4Max,
     & viscA4Grid, viscA4GridMax, viscA4GridMin,
     & viscAhReMax, viscA4ReMax,
     & viscC4leith, viscC4leithD, viscArNr,
     & diffKhT, diffK4T, diffKrNrT,
     & diffKhS, diffK4S, diffKrNrS,
     & diffKrBL79surf, diffKrBL79deep, diffKrBL79scl, diffKrBL79Ho,
     & BL79LatVary,
     & diffKrBLEQsurf, diffKrBLEQdeep, diffKrBLEQscl, diffKrBLEQHo,
     & tauCD, rCD, epsAB_CD,
     & freeSurfFac, implicSurfPress, implicDiv2Dflow, implicitNHPress,
     & hFacMin, hFacMinDz, hFacInf, hFacSup,
     & gravity, recip_gravity, gBaro,
     & rhonil, recip_rhonil, rhoConst, recip_rhoConst,
     & rhoFacC, recip_rhoFacC, rhoFacF, recip_rhoFacF,
     & rhoConstFresh, rho1Ref, tRef, sRef, phiRef, dBdrRef,
     & rVel2wUnit, wUnit2rVel, mass2rUnit, rUnit2mass,
     & baseTime, startTime, endTime,
     & chkPtFreq, pChkPtFreq, dumpFreq, adjDumpFreq,
     & diagFreq, taveFreq, tave_lastIter, monitorFreq, adjMonitorFreq,
     & afFacMom, vfFacMom, pfFacMom, cfFacMom, foFacMom, mtFacMom,
     & cosPower, cAdjFreq, omega, rotationPeriod,
     & tauThetaClimRelax, tauSaltClimRelax, latBandClimRelax,
     & externForcingCycle, externForcingPeriod,
     & convertFW2Salt, temp_EvPrRn, salt_EvPrRn,
     & temp_addMass, salt_addMass, hFacMinDr, hFacMinDp,
     & ivdc_kappa, hMixCriteria, dRhoSmall, hMixSmooth,
     & Ro_SeaLevel, rSigmaBnd,
     & sideDragFactor, bottomDragLinear, bottomDragQuadratic, nh_Am2,
     & smoothAbsFuncRange,
     & tCylIn, tCylOut,
     & phiEuler, thetaEuler, psiEuler
      Real*8 cg2dTargetResidual
      Real*8 cg2dTargetResWunit
      Real*8 cg3dTargetResidual
      Real*8 cg2dpcOffDFac
      Real*8 delR(Nr)
      Real*8 delRc(Nr+1)
      Real*8 delX(Nx)
      Real*8 delY(Ny)
      Real*8 deltaT
      Real*8 deltaTClock
      Real*8 deltaTmom
      Real*8 dTtracerLev(Nr)
      Real*8 deltaTfreesurf
      Real*8 abEps, alph_AB, beta_AB
      Real*8 xgOrigin
      Real*8 ygOrigin
      Real*8 rSphere
      Real*8 recip_rSphere
      Real*8 f0
      Real*8 freeSurfFac
      Real*8 implicSurfPress
      Real*8 implicDiv2Dflow
      Real*8 implicitNHPress
      Real*8 hFacMin
      Real*8 hFacMinDz
      Real*8 hFacMinDp
      Real*8 hFacMinDr
      Real*8 hFacInf
      Real*8 hFacSup
      Real*8 beta
      Real*8 viscArNr(Nr)
      Real*8 viscFacAdj
      Real*8 viscAh
      Real*8 viscAhW
      Real*8 viscAhD
      Real*8 viscAhZ
      Real*8 viscAhMax
      Real*8 viscAhReMax
      Real*8 viscAhGrid, viscAhGridMax, viscAhGridMin
      Real*8 viscC2leith
      Real*8 viscC2leithD
      Real*8 viscC2smag
      Real*8 viscA4
      Real*8 viscA4W
      Real*8 viscA4D
      Real*8 viscA4Z
      Real*8 viscA4Max
      Real*8 viscA4ReMax
      Real*8 viscA4Grid, viscA4GridMax, viscA4GridMin
      Real*8 viscC4leith
      Real*8 viscC4leithD
      Real*8 viscC4smag
      Real*8 diffKhT
      Real*8 diffKrNrT(Nr)
      Real*8 diffK4T
      Real*8 diffKhS
      Real*8 diffKrNrS(Nr)
      Real*8 diffK4S
      Real*8 diffKrBL79surf
      Real*8 diffKrBL79deep
      Real*8 diffKrBL79scl
      Real*8 diffKrBL79Ho
      Real*8 BL79LatVary
      Real*8 diffKrBLEQsurf
      Real*8 diffKrBLEQdeep
      Real*8 diffKrBLEQscl
      Real*8 diffKrBLEQHo
      Real*8 tauCD, rCD, epsAB_CD
      Real*8 gravity
      Real*8 recip_gravity
      Real*8 gBaro
      Real*8 rhonil,        recip_rhonil
      Real*8 rhoConst,      recip_rhoConst
      Real*8 rhoFacC(Nr),   recip_rhoFacC(Nr)
      Real*8 rhoFacF(Nr+1), recip_rhoFacF(Nr+1)
      Real*8 rhoConstFresh
      Real*8 rho1Ref(Nr)
      Real*8 tRef(Nr)
      Real*8 sRef(Nr)
      Real*8 phiRef(2*Nr+1)
      Real*8 dBdrRef(Nr)
      Real*8 rVel2wUnit(Nr+1), wUnit2rVel(Nr+1)
      Real*8 mass2rUnit, rUnit2mass
      Real*8 baseTime
      Real*8 startTime
      Real*8 endTime
      Real*8 chkPtFreq
      Real*8 pChkPtFreq
      Real*8 dumpFreq
      Real*8 adjDumpFreq
      Real*8 diagFreq
      Real*8 taveFreq
      Real*8 tave_lastIter
      Real*8 monitorFreq
      Real*8 adjMonitorFreq
      Real*8 afFacMom
      Real*8 vfFacMom
      Real*8 pfFacMom
      Real*8 cfFacMom
      Real*8 foFacMom
      Real*8 mtFacMom
      Real*8 cosPower
      Real*8 cAdjFreq
      Real*8 omega
      Real*8 rotationPeriod
      Real*8 tauThetaClimRelax
      Real*8 tauSaltClimRelax
      Real*8 latBandClimRelax
      Real*8 externForcingCycle
      Real*8 externForcingPeriod
      Real*8 convertFW2Salt
      Real*8 temp_EvPrRn
      Real*8 salt_EvPrRn
      Real*8 temp_addMass
      Real*8 salt_addMass
      Real*8 ivdc_kappa
      Real*8 hMixCriteria
      Real*8 dRhoSmall
      Real*8 hMixSmooth
      Real*8 Ro_SeaLevel
      Real*8 rSigmaBnd
      Real*8 sideDragFactor
      Real*8 bottomDragLinear
      Real*8 bottomDragQuadratic
      Real*8 smoothAbsFuncRange
      Real*8 nh_Am2
      Real*8 tCylIn
      Real*8 tCylOut
      Real*8 phiEuler, thetaEuler, psiEuler
      COMMON /PARM_A/ HeatCapacity_Cp,recip_Cp
      Real*8 HeatCapacity_Cp
      Real*8 recip_Cp
      COMMON /PARM_ATM/
     &            celsius2K,
     &            atm_Cp, atm_Rd, atm_kappa, atm_Rq, atm_Po,
     &            integr_GeoPot, selectFindRoSurf
      Real*8 celsius2K
      Real*8 atm_Po, atm_Cp, atm_Rd, atm_kappa, atm_Rq
      INTEGER integr_GeoPot, selectFindRoSurf
      LOGICAL useGAD
      LOGICAL useOBCS
      LOGICAL useSHAP_FILT
      LOGICAL useZONAL_FILT
      LOGICAL useOPPS
      LOGICAL usePP81
      LOGICAL useMY82
      LOGICAL useGGL90
      LOGICAL useKPP
      LOGICAL useGMRedi
      LOGICAL useDOWN_SLOPE
      LOGICAL useCAL
      LOGICAL useEXF
      LOGICAL useBulkForce
      LOGICAL useEBM
      LOGICAL useCheapAML
      LOGICAL useGrdchk
      LOGICAL useSMOOTH
      LOGICAL useECCO
      LOGICAL useSBO
      LOGICAL useFLT
      LOGICAL usePTRACERS
      LOGICAL useGCHEM
      LOGICAL useRBCS
      LOGICAL useOffLine
      LOGICAL useMATRIX
      LOGICAL useSEAICE
      LOGICAL useSALT_PLUME
      LOGICAL useShelfIce
      LOGICAL useICEFRONT
      LOGICAL useThSIce
      LOGICAL useATM2d
      LOGICAL useAIM
      LOGICAL useLand
      LOGICAL useFizhi
      LOGICAL useGridAlt
      LOGICAL useDiagnostics
      LOGICAL useREGRID
      LOGICAL useLayers
      LOGICAL useMNC
      LOGICAL useRunClock
      LOGICAL useEMBED_FILES
      LOGICAL useMYPACKAGE
      COMMON /PARM_PACKAGES/
     &        useGAD, useOBCS, useSHAP_FILT, useZONAL_FILT,
     &        useOPPS, usePP81, useMY82, useGGL90, useKPP,
     &        useGMRedi, useDOWN_SLOPE,
     &        useCAL, useEXF, useBulkForce, useEBM, useCheapAML,
     &        useGrdchk, useSMOOTH, useECCO, useSBO, useFLT,
     &        usePTRACERS, useGCHEM, useRBCS, useOffLine, useMATRIX,
     &        useSEAICE, useSALT_PLUME, useShelfIce,
     &        useICEFRONT, useThSIce,
     &        useATM2D, useAIM, useLand, useFizhi, useGridAlt,
     &        useDiagnostics, useREGRID, useLayers, useMNC,
     &        useRunClock, useEMBED_FILES,
     &        useMYPACKAGE
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
      COMMON /GRID_RL/
     &  cosFacU, cosFacV, sqCosFacU, sqCosFacV,
     &  deepFacC, deepFac2C, recip_deepFacC, recip_deepFac2C,
     &  deepFacF, deepFac2F, recip_deepFacF, recip_deepFac2F,
     &  gravitySign, rkSign, globalArea
      Real*8 cosFacU        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 cosFacV        (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacU      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 sqCosFacV      (1-Oly:sNy+Oly,nSx,nSy)
      Real*8 deepFacC       (Nr)
      Real*8 deepFac2C      (Nr)
      Real*8 deepFacF       (Nr+1)
      Real*8 deepFac2F      (Nr+1)
      Real*8 recip_deepFacC (Nr)
      Real*8 recip_deepFac2C(Nr)
      Real*8 recip_deepFacF (Nr+1)
      Real*8 recip_deepFac2F(Nr+1)
      Real*8 gravitySign
      Real*8 rkSign
      Real*8 globalArea
cC    maskH   :: cell Center full-column mask (= 2D mask)
      COMMON /GRID_RS/
     &  dxC,dxF,dxG,dxV,dyC,dyF,dyG,dyU,
     &  R_low, rLowW, rLowS,
     &  Ro_surf, rSurfW, rSurfS,
     &  hFacC, hFacW, hFacS,
     &  recip_dxC,recip_dxF,recip_dxG,recip_dxV,
     &  recip_dyC,recip_dyF,recip_dyG,recip_dyU,
     &  recip_Rcol,
     &  recip_hFacC,recip_hFacW,recip_hFacS,
     &  xC,yC,rA,rAw,rAs,rAz,xG,yG,
     &  maskInC, maskInW, maskInS,
     &  maskC, maskW, maskS,
     &  recip_rA,recip_rAw,recip_rAs,recip_rAz,
     &  drC, drF, recip_drC, recip_drF, rC, rF,
     &  aHybSigmF, bHybSigmF, aHybSigmC, bHybSigmC,
     &  dAHybSigF, dBHybSigF, dBHybSigC, dAHybSigC,
     &  tanPhiAtU, tanPhiAtV, angleCosC, angleSinC,
     &  fCori, fCoriG, fCoriCos
      Real*8 dxC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dxV            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyC            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyF            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyG            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 dyU            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 R_low          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rLowS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 Ro_surf        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfW         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rSurfS         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 hFacC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 hFacS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_dxC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dxV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyF      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyG      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_dyU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_Rcol     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_hFacC    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacW    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 recip_hFacS    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 xC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 xG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yC             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 yG             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rA             (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAw            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAs            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 rAz            (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rA       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAw      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAs      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 recip_rAz      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInC        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInW        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskInS        (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 maskC          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskW          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 maskS          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
      Real*8 drC            (Nr)
      Real*8 drF            (Nr)
      Real*8 recip_drC      (Nr)
      Real*8 recip_drF      (Nr)
      Real*8 rC             (Nr)
      Real*8 rF             (Nr+1)
      Real*8 aHybSigmF      (Nr+1)
      Real*8 bHybSigmF      (Nr+1)
      Real*8 aHybSigmC      (Nr)
      Real*8 bHybSigmC      (Nr)
      Real*8 dAHybSigF      (Nr)
      Real*8 dBHybSigF      (Nr)
      Real*8 dBHybSigC      (Nr+1)
      Real*8 dAHybSigC      (Nr+1)
      Real*8 tanPhiAtU      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 tanPhiAtV      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleCosC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 angleSinC      (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCori          (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriG         (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8 fCoriCos       (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /GRID_I/
     &  kSurfC, kSurfW, kSurfS,
     &  kLowC
      INTEGER kSurfC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfW(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kSurfS(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      INTEGER kLowC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
C
      COMMON /SURF_FIXED/ Bo_surf, recip_Bo, topoZ, phi0surf
      Real*8  Bo_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  recip_Bo(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  topoZ   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      Real*8  phi0surf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
      COMMON /SURF_CORREC/ TsurfCor, SsurfCor
      Real*8 TsurfCor
      Real*8 SsurfCor
      COMMON /EXACT_ETA_LOCAL/ etaHnm1, dEtaHdt, PmEpR
      Real*8 etaHnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8 dEtaHdt(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
      Real*8  PmEpR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
c
c
c
c
c
      integer nyears_chkpt
      integer nmonths_chkpt
      integer ndays_chkpt
      integer ngeom_chkpt
      integer ncheck_chkpt
      integer nthreads_chkpt
      parameter (nyears_chkpt   =          1 )
      parameter (nmonths_chkpt  =         12 )
      parameter (ndays_chkpt    =         31 )
      parameter (ngeom_chkpt    = nr*nsx*nsy )
      parameter (ncheck_chkpt   =          6 )
      parameter ( nthreads_chkpt = 1 )
      integer    nchklev_1
      parameter( nchklev_1      =    30 )
      integer    nchklev_2
      parameter( nchklev_2      =    5 )
      integer    nchklev_3
      parameter( nchklev_3      =    5 )
c
c
c
      common /tamc_keys_i/
     &                     ikey_dynamics,
     &                     ikey_yearly,
     &                     ikey_daily_1,
     &                     ikey_daily_2,
     &                     iloop_daily
      integer ikey_dynamics
      integer ikey_yearly
      integer ikey_daily_1
      integer ikey_daily_2
      integer iloop_daily
      INTEGER    isbyte
      PARAMETER( isbyte      = 8 )
      INTEGER    maximpl
      PARAMETER( maximpl     = 6 )
      INTEGER    maxpass
      PARAMETER( maxpass     = 2 )
      INTEGER    maxcube
      PARAMETER( maxcube     = 1 )
      INTEGER act0, act1, act2, act3, act4
      INTEGER max0, max1, max2, max3
      INTEGER iikey, kkey, passkey, igadkey, 
     &        itdkey, idynkey, igmkey, iptrkey
C
      integer           key, ikey
      common /tamckeys/ key, ikey
      Real*8 myTime
      INTEGER myIter
      INTEGER myThid
      RETURN
      END
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ad_input_code_ad.f.old
Type: application/x-trash
Size: 2770664 bytes
Desc: not available
URL: <http://mitgcm.org/pipermail/mitgcm-devel/attachments/20101014/5f96a66c/attachment-0001.bin>
-------------- next part --------------
C                           DISCLAIMER
C
C   This file was generated by TAF version 2.0.2
C
C   FASTOPT DISCLAIMS  ALL  WARRANTIES,  EXPRESS  OR  IMPLIED,
C   INCLUDING (WITHOUT LIMITATION) ALL IMPLIED  WARRANTIES  OF
C   MERCHANTABILITY  OR FITNESS FOR A PARTICULAR PURPOSE, WITH
C   RESPECT TO THE SOFTWARE AND USER PROGRAMS.   IN  NO  EVENT
C   SHALL  FASTOPT BE LIABLE FOR ANY LOST OR ANTICIPATED PROF-
C   ITS, OR ANY INDIRECT, INCIDENTAL, EXEMPLARY,  SPECIAL,  OR
C   CONSEQUENTIAL  DAMAGES, WHETHER OR NOT FASTOPT WAS ADVISED
C   OF THE POSSIBILITY OF SUCH DAMAGES.
C
C                           Haftungsbeschraenkung
C   FastOpt gibt ausdruecklich keine Gewaehr, explizit oder indirekt,
C   bezueglich der Brauchbarkeit  der Software  fuer einen bestimmten
C   Zweck.   Unter  keinen  Umstaenden   ist  FastOpt   haftbar  fuer
C   irgendeinen Verlust oder nicht eintretenden erwarteten Gewinn und
C   allen indirekten,  zufaelligen,  exemplarischen  oder  speziellen
C   Schaeden  oder  Folgeschaeden  unabhaengig  von einer eventuellen
C   Mitteilung darueber an FastOpt.
C
      subroutine adadams_bashforth2( bi, bj, k, adgtracer, adgtrnm1, 
     $startab, myiter )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adgtracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtrnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer k
      integer myiter
      integer startab

C==============================================
C declare local variables
C==============================================
      double precision ab05
      double precision ab15
      double precision adgtrtmp
      integer i
      integer j

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adgtrtmp = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (myiter .eq. niter0 .and. startab .eq. 0) then
        ab15 = 1.d0
        ab05 = 0.d0
      else
        ab15 = 1.5d0+abeps
        ab05 = -(0.5d0+abeps)
      endif
      do j = sny+oly, 1-oly, -1
        adgtrtmp = 0.d0
        do i = snx+olx, 1-olx, -1
          adgtrtmp = 0.d0
          adgtrtmp = adgtrtmp+adgtracer(i,j,k,bi,bj)
          adgtracer(i,j,k,bi,bj) = 0.d0
          adgtracer(i,j,k,bi,bj) = adgtracer(i,j,k,bi,bj)+adgtrnm1(i,j,
     $k,bi,bj)
          adgtrnm1(i,j,k,bi,bj) = 0.d0
          adgtracer(i,j,k,bi,bj) = adgtracer(i,j,k,bi,bj)+adgtrtmp*ab15
          adgtrnm1(i,j,k,bi,bj) = adgtrnm1(i,j,k,bi,bj)+adgtrtmp*ab05
          adgtrtmp = 0.d0
        end do
      end do

      end

      subroutine adautodiff_restore( mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer ndv2d
      parameter ( ndv2d = 23 )
      integer ndv3d
      parameter ( ndv3d = 12 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adstoredynvars2d(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy,ndv2d)
      double precision adstoredynvars3d(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy,ndv3d)
      common /adautodiff_store_dyn/ adstoredynvars3d, adstoredynvars2d

      double precision adrhoinsitu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision adtotphihyd(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      common /addynvars_diag/ adtotphihyd, adrhoinsitu

      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision adetah(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /addynvars_r_2/ adetah

      double precision addetahdt(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adpmepr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adexact_eta_local/ addetahdt, adpmepr

      double precision adsurfaceforcings(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingt(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingtice(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingu(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingv(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      common /adsurface_forcing/ adsurfaceforcingu, adsurfaceforcingv, 
     $adsurfaceforcingt, adsurfaceforcings, adsurfaceforcingtice

      double precision adempmr0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adempmr1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adqnet0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adqnet1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsaltflux0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsaltflux1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsss0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsss1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsst0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsst1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtaux0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtaux1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtauy0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtauy1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adtdfields/ adtaux0, adtauy0, adqnet0, adempmr0, adsst0, 
     $adsss0, adtaux1, adtauy1, adqnet1, adempmr1, adsst1, adsss1, 
     $adsaltflux0, adsaltflux1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

C==============================================
C declare arguments
C==============================================
      integer mythid

C==============================================
C declare local variables
C==============================================
      integer bi
      integer bj
      integer i
      integer j
      integer k

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do bj = mybylo(mythid), mybyhi(mythid)
        do bi = mybxlo(mythid), mybxhi(mythid)
          do k = 1, nr
            do j = 1-oly, sny+oly
              do i = 1-olx, snx+olx
                adstoredynvars3d(i,j,k,bi,bj,12) = adstoredynvars3d(i,j,
     $k,bi,bj,12)+adtotphihyd(i,j,k,bi,bj)
                adtotphihyd(i,j,k,bi,bj) = 0.d0
                adstoredynvars3d(i,j,k,bi,bj,11) = adstoredynvars3d(i,j,
     $k,bi,bj,11)+adwvel(i,j,k,bi,bj)
                adwvel(i,j,k,bi,bj) = 0.d0
                adstoredynvars3d(i,j,k,bi,bj,10) = adstoredynvars3d(i,j,
     $k,bi,bj,10)+advvel(i,j,k,bi,bj)
                advvel(i,j,k,bi,bj) = 0.d0
                adstoredynvars3d(i,j,k,bi,bj,9) = adstoredynvars3d(i,j,
     $k,bi,bj,9)+aduvel(i,j,k,bi,bj)
                aduvel(i,j,k,bi,bj) = 0.d0
                adstoredynvars3d(i,j,k,bi,bj,8) = adstoredynvars3d(i,j,
     $k,bi,bj,8)+adsalt(i,j,k,bi,bj)
                adsalt(i,j,k,bi,bj) = 0.d0
                adstoredynvars3d(i,j,k,bi,bj,7) = adstoredynvars3d(i,j,
     $k,bi,bj,7)+adtheta(i,j,k,bi,bj)
                adtheta(i,j,k,bi,bj) = 0.d0
                adstoredynvars3d(i,j,k,bi,bj,6) = adstoredynvars3d(i,j,
     $k,bi,bj,6)+adgvnm1(i,j,k,bi,bj)
                adgvnm1(i,j,k,bi,bj) = 0.d0
                adstoredynvars3d(i,j,k,bi,bj,5) = adstoredynvars3d(i,j,
     $k,bi,bj,5)+adgunm1(i,j,k,bi,bj)
                adgunm1(i,j,k,bi,bj) = 0.d0
                adstoredynvars3d(i,j,k,bi,bj,4) = adstoredynvars3d(i,j,
     $k,bi,bj,4)+adgsnm1(i,j,k,bi,bj)
                adgsnm1(i,j,k,bi,bj) = 0.d0
                adstoredynvars3d(i,j,k,bi,bj,3) = adstoredynvars3d(i,j,
     $k,bi,bj,3)+adgtnm1(i,j,k,bi,bj)
                adgtnm1(i,j,k,bi,bj) = 0.d0
                adstoredynvars3d(i,j,k,bi,bj,2) = adstoredynvars3d(i,j,
     $k,bi,bj,2)+adgt(i,j,k,bi,bj)
                adgt(i,j,k,bi,bj) = 0.d0
                adstoredynvars3d(i,j,k,bi,bj,1) = adstoredynvars3d(i,j,
     $k,bi,bj,1)+adgs(i,j,k,bi,bj)
                adgs(i,j,k,bi,bj) = 0.d0
              end do
            end do
          end do
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              adstoredynvars2d(i,j,bi,bj,23) = adstoredynvars2d(i,j,bi,
     $bj,23)+adpmepr(i,j,bi,bj)
              adpmepr(i,j,bi,bj) = 0.d0
              adstoredynvars2d(i,j,bi,bj,22) = adstoredynvars2d(i,j,bi,
     $bj,22)+addetahdt(i,j,bi,bj)
              addetahdt(i,j,bi,bj) = 0.d0
              adstoredynvars2d(i,j,bi,bj,21) = adstoredynvars2d(i,j,bi,
     $bj,21)+adetah(i,j,bi,bj)
              adetah(i,j,bi,bj) = 0.d0
              adstoredynvars2d(i,j,bi,bj,16) = adstoredynvars2d(i,j,bi,
     $bj,16)+adsaltflux1(i,j,bi,bj)
              adsaltflux1(i,j,bi,bj) = 0.d0
              adstoredynvars2d(i,j,bi,bj,15) = adstoredynvars2d(i,j,bi,
     $bj,15)+adsaltflux0(i,j,bi,bj)
              adsaltflux0(i,j,bi,bj) = 0.d0
              adstoredynvars2d(i,j,bi,bj,14) = adstoredynvars2d(i,j,bi,
     $bj,14)+adsss1(i,j,bi,bj)
              adsss1(i,j,bi,bj) = 0.d0
              adstoredynvars2d(i,j,bi,bj,13) = adstoredynvars2d(i,j,bi,
     $bj,13)+adsss0(i,j,bi,bj)
              adsss0(i,j,bi,bj) = 0.d0
              adstoredynvars2d(i,j,bi,bj,12) = adstoredynvars2d(i,j,bi,
     $bj,12)+adsst1(i,j,bi,bj)
              adsst1(i,j,bi,bj) = 0.d0
              adstoredynvars2d(i,j,bi,bj,11) = adstoredynvars2d(i,j,bi,
     $bj,11)+adsst0(i,j,bi,bj)
              adsst0(i,j,bi,bj) = 0.d0
              adstoredynvars2d(i,j,bi,bj,10) = adstoredynvars2d(i,j,bi,
     $bj,10)+adempmr1(i,j,bi,bj)
              adempmr1(i,j,bi,bj) = 0.d0
              adstoredynvars2d(i,j,bi,bj,9) = adstoredynvars2d(i,j,bi,
     $bj,9)+adempmr0(i,j,bi,bj)
              adempmr0(i,j,bi,bj) = 0.d0
              adstoredynvars2d(i,j,bi,bj,8) = adstoredynvars2d(i,j,bi,
     $bj,8)+adqnet1(i,j,bi,bj)
              adqnet1(i,j,bi,bj) = 0.d0
              adstoredynvars2d(i,j,bi,bj,7) = adstoredynvars2d(i,j,bi,
     $bj,7)+adqnet0(i,j,bi,bj)
              adqnet0(i,j,bi,bj) = 0.d0
              adstoredynvars2d(i,j,bi,bj,6) = adstoredynvars2d(i,j,bi,
     $bj,6)+adtauy1(i,j,bi,bj)
              adtauy1(i,j,bi,bj) = 0.d0
              adstoredynvars2d(i,j,bi,bj,5) = adstoredynvars2d(i,j,bi,
     $bj,5)+adtauy0(i,j,bi,bj)
              adtauy0(i,j,bi,bj) = 0.d0
              adstoredynvars2d(i,j,bi,bj,4) = adstoredynvars2d(i,j,bi,
     $bj,4)+adtaux1(i,j,bi,bj)
              adtaux1(i,j,bi,bj) = 0.d0
              adstoredynvars2d(i,j,bi,bj,3) = adstoredynvars2d(i,j,bi,
     $bj,3)+adtaux0(i,j,bi,bj)
              adtaux0(i,j,bi,bj) = 0.d0
              adstoredynvars2d(i,j,bi,bj,2) = adstoredynvars2d(i,j,bi,
     $bj,2)+adsurfaceforcingtice(i,j,bi,bj)
              adsurfaceforcingtice(i,j,bi,bj) = 0.d0
              adstoredynvars2d(i,j,bi,bj,1) = adstoredynvars2d(i,j,bi,
     $bj,1)+adetan(i,j,bi,bj)
              adetan(i,j,bi,bj) = 0.d0
            end do
          end do
        end do
      end do

      end

      subroutine adautodiff_store( mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer ndv2d
      parameter ( ndv2d = 23 )
      integer ndv3d
      parameter ( ndv3d = 12 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adstoredynvars2d(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy,ndv2d)
      double precision adstoredynvars3d(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy,ndv3d)
      common /adautodiff_store_dyn/ adstoredynvars3d, adstoredynvars2d

      double precision adrhoinsitu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision adtotphihyd(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      common /addynvars_diag/ adtotphihyd, adrhoinsitu

      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision adetah(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /addynvars_r_2/ adetah

      double precision addetahdt(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adpmepr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adexact_eta_local/ addetahdt, adpmepr

      double precision adsurfaceforcings(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingt(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingtice(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingu(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingv(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      common /adsurface_forcing/ adsurfaceforcingu, adsurfaceforcingv, 
     $adsurfaceforcingt, adsurfaceforcings, adsurfaceforcingtice

      double precision adempmr0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adempmr1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adqnet0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adqnet1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsaltflux0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsaltflux1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsss0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsss1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsst0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsst1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtaux0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtaux1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtauy0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtauy1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adtdfields/ adtaux0, adtauy0, adqnet0, adempmr0, adsst0, 
     $adsss0, adtaux1, adtauy1, adqnet1, adempmr1, adsst1, adsss1, 
     $adsaltflux0, adsaltflux1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

C==============================================
C declare arguments
C==============================================
      integer mythid

C==============================================
C declare local variables
C==============================================
      integer bi
      integer bj
      integer i
      integer j
      integer k

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do bj = mybylo(mythid), mybyhi(mythid)
        do bi = mybxlo(mythid), mybxhi(mythid)
          do k = 1, nr
            do j = 1-oly, sny+oly
              do i = 1-olx, snx+olx
                adtotphihyd(i,j,k,bi,bj) = adtotphihyd(i,j,k,bi,bj)+
     $adstoredynvars3d(i,j,k,bi,bj,12)
                adstoredynvars3d(i,j,k,bi,bj,12) = 0.d0
                adwvel(i,j,k,bi,bj) = adwvel(i,j,k,bi,bj)+
     $adstoredynvars3d(i,j,k,bi,bj,11)
                adstoredynvars3d(i,j,k,bi,bj,11) = 0.d0
                advvel(i,j,k,bi,bj) = advvel(i,j,k,bi,bj)+
     $adstoredynvars3d(i,j,k,bi,bj,10)
                adstoredynvars3d(i,j,k,bi,bj,10) = 0.d0
                aduvel(i,j,k,bi,bj) = aduvel(i,j,k,bi,bj)+
     $adstoredynvars3d(i,j,k,bi,bj,9)
                adstoredynvars3d(i,j,k,bi,bj,9) = 0.d0
                adsalt(i,j,k,bi,bj) = adsalt(i,j,k,bi,bj)+
     $adstoredynvars3d(i,j,k,bi,bj,8)
                adstoredynvars3d(i,j,k,bi,bj,8) = 0.d0
                adtheta(i,j,k,bi,bj) = adtheta(i,j,k,bi,bj)+
     $adstoredynvars3d(i,j,k,bi,bj,7)
                adstoredynvars3d(i,j,k,bi,bj,7) = 0.d0
                adgvnm1(i,j,k,bi,bj) = adgvnm1(i,j,k,bi,bj)+
     $adstoredynvars3d(i,j,k,bi,bj,6)
                adstoredynvars3d(i,j,k,bi,bj,6) = 0.d0
                adgunm1(i,j,k,bi,bj) = adgunm1(i,j,k,bi,bj)+
     $adstoredynvars3d(i,j,k,bi,bj,5)
                adstoredynvars3d(i,j,k,bi,bj,5) = 0.d0
                adgsnm1(i,j,k,bi,bj) = adgsnm1(i,j,k,bi,bj)+
     $adstoredynvars3d(i,j,k,bi,bj,4)
                adstoredynvars3d(i,j,k,bi,bj,4) = 0.d0
                adgtnm1(i,j,k,bi,bj) = adgtnm1(i,j,k,bi,bj)+
     $adstoredynvars3d(i,j,k,bi,bj,3)
                adstoredynvars3d(i,j,k,bi,bj,3) = 0.d0
                adgt(i,j,k,bi,bj) = adgt(i,j,k,bi,bj)+adstoredynvars3d(
     $i,j,k,bi,bj,2)
                adstoredynvars3d(i,j,k,bi,bj,2) = 0.d0
                adgs(i,j,k,bi,bj) = adgs(i,j,k,bi,bj)+adstoredynvars3d(
     $i,j,k,bi,bj,1)
                adstoredynvars3d(i,j,k,bi,bj,1) = 0.d0
              end do
            end do
          end do
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              adpmepr(i,j,bi,bj) = adpmepr(i,j,bi,bj)+adstoredynvars2d(
     $i,j,bi,bj,23)
              adstoredynvars2d(i,j,bi,bj,23) = 0.d0
              addetahdt(i,j,bi,bj) = addetahdt(i,j,bi,bj)+
     $adstoredynvars2d(i,j,bi,bj,22)
              adstoredynvars2d(i,j,bi,bj,22) = 0.d0
              adetah(i,j,bi,bj) = adetah(i,j,bi,bj)+adstoredynvars2d(i,
     $j,bi,bj,21)
              adstoredynvars2d(i,j,bi,bj,21) = 0.d0
              adstoredynvars2d(i,j,bi,bj,20) = 0.d0
              adstoredynvars2d(i,j,bi,bj,19) = 0.d0
              adstoredynvars2d(i,j,bi,bj,18) = 0.d0
              adstoredynvars2d(i,j,bi,bj,17) = 0.d0
              adsaltflux1(i,j,bi,bj) = adsaltflux1(i,j,bi,bj)+
     $adstoredynvars2d(i,j,bi,bj,16)
              adstoredynvars2d(i,j,bi,bj,16) = 0.d0
              adsaltflux0(i,j,bi,bj) = adsaltflux0(i,j,bi,bj)+
     $adstoredynvars2d(i,j,bi,bj,15)
              adstoredynvars2d(i,j,bi,bj,15) = 0.d0
              adsss1(i,j,bi,bj) = adsss1(i,j,bi,bj)+adstoredynvars2d(i,
     $j,bi,bj,14)
              adstoredynvars2d(i,j,bi,bj,14) = 0.d0
              adsss0(i,j,bi,bj) = adsss0(i,j,bi,bj)+adstoredynvars2d(i,
     $j,bi,bj,13)
              adstoredynvars2d(i,j,bi,bj,13) = 0.d0
              adsst1(i,j,bi,bj) = adsst1(i,j,bi,bj)+adstoredynvars2d(i,
     $j,bi,bj,12)
              adstoredynvars2d(i,j,bi,bj,12) = 0.d0
              adsst0(i,j,bi,bj) = adsst0(i,j,bi,bj)+adstoredynvars2d(i,
     $j,bi,bj,11)
              adstoredynvars2d(i,j,bi,bj,11) = 0.d0
              adempmr1(i,j,bi,bj) = adempmr1(i,j,bi,bj)+
     $adstoredynvars2d(i,j,bi,bj,10)
              adstoredynvars2d(i,j,bi,bj,10) = 0.d0
              adempmr0(i,j,bi,bj) = adempmr0(i,j,bi,bj)+
     $adstoredynvars2d(i,j,bi,bj,9)
              adstoredynvars2d(i,j,bi,bj,9) = 0.d0
              adqnet1(i,j,bi,bj) = adqnet1(i,j,bi,bj)+adstoredynvars2d(
     $i,j,bi,bj,8)
              adstoredynvars2d(i,j,bi,bj,8) = 0.d0
              adqnet0(i,j,bi,bj) = adqnet0(i,j,bi,bj)+adstoredynvars2d(
     $i,j,bi,bj,7)
              adstoredynvars2d(i,j,bi,bj,7) = 0.d0
              adtauy1(i,j,bi,bj) = adtauy1(i,j,bi,bj)+adstoredynvars2d(
     $i,j,bi,bj,6)
              adstoredynvars2d(i,j,bi,bj,6) = 0.d0
              adtauy0(i,j,bi,bj) = adtauy0(i,j,bi,bj)+adstoredynvars2d(
     $i,j,bi,bj,5)
              adstoredynvars2d(i,j,bi,bj,5) = 0.d0
              adtaux1(i,j,bi,bj) = adtaux1(i,j,bi,bj)+adstoredynvars2d(
     $i,j,bi,bj,4)
              adstoredynvars2d(i,j,bi,bj,4) = 0.d0
              adtaux0(i,j,bi,bj) = adtaux0(i,j,bi,bj)+adstoredynvars2d(
     $i,j,bi,bj,3)
              adstoredynvars2d(i,j,bi,bj,3) = 0.d0
              adsurfaceforcingtice(i,j,bi,bj) = adsurfaceforcingtice(i,
     $j,bi,bj)+adstoredynvars2d(i,j,bi,bj,2)
              adstoredynvars2d(i,j,bi,bj,2) = 0.d0
              adetan(i,j,bi,bj) = adetan(i,j,bi,bj)+adstoredynvars2d(i,
     $j,bi,bj,1)
              adstoredynvars2d(i,j,bi,bj,1) = 0.d0
            end do
          end do
        end do
      end do

      end

      subroutine adcalc_3d_diffusivity( bi, bj, imin, imax, jmin, jmax, 
     $tridentity, trusegmredi, trusekpp, adkappartr )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
C==============================================
C declare arguments
C==============================================
      double precision adkappartr(1-olx:snx+olx,1-oly:sny+oly,nr)
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer tridentity
      logical trusegmredi
      logical trusekpp

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      integer k

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (trusegmredi) then
        call adgmredi_calc_diff( bi,bj,imin,imax,jmin,jmax,0,nr,
     $adkappartr,tridentity )
      endif
      if ( .not. trusekpp) then
        do k = 1, nr
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              if ( .true. ) then
                adkappartr(i,j,k) = 0.d0
              endif
            end do
          end do
        end do
      endif

      end

      subroutine adcalc_common_factors( aduvel, advvel, adufld, advfld, 
     $adutrans, advtrans, k, bi, bj )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer k

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          xa(i,j) = dyg(i,j,bi,bj)*deepfacc(k)*drf(k)*hfacw(i,j,k,bi,bj)
          ya(i,j) = dxg(i,j,bi,bj)*deepfacc(k)*drf(k)*hfacs(i,j,k,bi,bj)
        end do
      end do
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          advfld(i,j) = advfld(i,j)+advtrans(i,j)*ya(i,j)*rhofacc(k)
          advtrans(i,j) = 0.d0
          adufld(i,j) = adufld(i,j)+adutrans(i,j)*xa(i,j)*rhofacc(k)
          adutrans(i,j) = 0.d0
        end do
      end do
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          advvel(i,j,k,bi,bj) = advvel(i,j,k,bi,bj)+advfld(i,j)
          advfld(i,j) = 0.d0
          aduvel(i,j,k,bi,bj) = aduvel(i,j,k,bi,bj)+adufld(i,j)
          adufld(i,j) = 0.d0
        end do
      end do

      end

      subroutine adcalc_diffusivity( bi, bj, imin, imax, jmin, jmax, k, 
     $maskup, adkappart, adkappars )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer gad_salinity
      parameter ( gad_salinity = 2 )
      integer gad_temperature
      parameter ( gad_temperature = 1 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

C==============================================
C declare arguments
C==============================================
      double precision adkappars(1-olx:snx+olx,1-oly:sny+oly)
      double precision adkappart(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k
      double precision maskup(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          adkappars(i,j) = adkappars(i,j)*maskup(i,j)
          adkappart(i,j) = adkappart(i,j)*maskup(i,j)
        end do
      end do
      if (usegmredi) then
        call adgmredi_calc_diff( bi,bj,imin,imax,jmin,jmax,k,1,
     $adkappars,gad_salinity )
        call adgmredi_calc_diff( bi,bj,imin,imax,jmin,jmax,k,1,
     $adkappart,gad_temperature )
      endif
      if ( .not. usekpp) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adkappars(i,j) = 0.d0
          end do
        end do
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adkappart(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine adcalc_div_ghat( bi, bj, k, adcg2d_b )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adcg2d_b(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer bi
      integer bj
      integer k

C==============================================
C declare local variables
C==============================================
      double precision adpf(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer ip1
      integer ip2
      integer j
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adpf(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1, sny+1
        do i = 1, snx+1
          xa(i,j) = dyg(i,j,bi,bj)*deepfacc(k)*drf(k)*hfacw(i,j,k,bi,bj)
     $*rhofacc(k)
          ya(i,j) = dxg(i,j,bi,bj)*deepfacc(k)*drf(k)*hfacs(i,j,k,bi,bj)
     $*rhofacc(k)
        end do
      end do
      do j = 1, sny
        do i = 1, snx
          adpf(i,j+1) = adpf(i,j+1)+adcg2d_b(i,j,bi,bj)
          adpf(i,j) = adpf(i,j)-adcg2d_b(i,j,bi,bj)
        end do
      end do
      if (implicdiv2dflow .eq. 1.) then
        do j = 1, sny+1
          do i = 1, snx
            adgv(i,j,k,bi,bj) = adgv(i,j,k,bi,bj)+adpf(i,j)*(ya(i,j)/
     $deltatmom)
            adpf(i,j) = 0.d0
          end do
        end do
      else if (exactconserv) then
        do j = 1, sny+1
          do i = 1, snx
            adgv(i,j,k,bi,bj) = adgv(i,j,k,bi,bj)+adpf(i,j)*(
     $implicdiv2dflow*ya(i,j)/deltatmom)
            adpf(i,j) = 0.d0
          end do
        end do
      else
        do j = 1, sny+1
          do i = 1, snx
            adgv(i,j,k,bi,bj) = adgv(i,j,k,bi,bj)+adpf(i,j)*(
     $implicdiv2dflow*ya(i,j)/deltatmom)
            advvel(i,j,k,bi,bj) = advvel(i,j,k,bi,bj)+adpf(i,j)*((1.d0-
     $implicdiv2dflow)*ya(i,j)/deltatmom)
            adpf(i,j) = 0.d0
          end do
        end do
      endif
      do j = 1, sny
        do i = 1, snx
          adpf(i+1,j) = adpf(i+1,j)+adcg2d_b(i,j,bi,bj)
          adpf(i,j) = adpf(i,j)-adcg2d_b(i,j,bi,bj)
        end do
      end do
      if (implicdiv2dflow .eq. 1.) then
        do j = 1, sny
          do i = 1, snx+1
            adgu(i,j,k,bi,bj) = adgu(i,j,k,bi,bj)+adpf(i,j)*(xa(i,j)/
     $deltatmom)
            adpf(i,j) = 0.d0
          end do
        end do
      else if (exactconserv) then
        do j = 1, sny
          do i = 1, snx+1
            adgu(i,j,k,bi,bj) = adgu(i,j,k,bi,bj)+adpf(i,j)*(
     $implicdiv2dflow*xa(i,j)/deltatmom)
            adpf(i,j) = 0.d0
          end do
        end do
      else
        do j = 1, sny
          do i = 1, snx+1
            adgu(i,j,k,bi,bj) = adgu(i,j,k,bi,bj)+adpf(i,j)*(
     $implicdiv2dflow*xa(i,j)/deltatmom)
            aduvel(i,j,k,bi,bj) = aduvel(i,j,k,bi,bj)+adpf(i,j)*((1.d0-
     $implicdiv2dflow)*xa(i,j)/deltatmom)
            adpf(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine adcalc_grad_phi_hyd( k, bi, bj, imin, imax, jmin, jmax,
     $ adphihydc, addphihydx, addphihydy )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision addphihydx(1-olx:snx+olx,1-oly:sny+oly)
      double precision addphihydy(1-olx:snx+olx,1-oly:sny+oly)
      double precision adphihydc(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k

C==============================================
C declare local variables
C==============================================
      double precision advarloc(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer ip1
      integer ip2
      integer j

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advarloc(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = jmin+1, jmax
        do i = imin, imax
          advarloc(i,j-1) = advarloc(i,j-1)-addphihydy(i,j)*recip_dyc(i,
     $j,bi,bj)*recip_deepfacc(k)*recip_rhofacc(k)
          advarloc(i,j) = advarloc(i,j)+addphihydy(i,j)*recip_dyc(i,j,
     $bi,bj)*recip_deepfacc(k)*recip_rhofacc(k)
          addphihydy(i,j) = 0.d0
        end do
      end do
      do j = jmin, jmax
        do i = imin+1, imax
          advarloc(i-1,j) = advarloc(i-1,j)-addphihydx(i,j)*recip_dxc(i,
     $j,bi,bj)*recip_deepfacc(k)*recip_rhofacc(k)
          advarloc(i,j) = advarloc(i,j)+addphihydx(i,j)*recip_dxc(i,j,
     $bi,bj)*recip_deepfacc(k)*recip_rhofacc(k)
          addphihydx(i,j) = 0.d0
        end do
      end do
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          addphihydy(i,j) = 0.d0
          addphihydx(i,j) = 0.d0
        end do
      end do
      if ( .true. ) then
        do j = jmin, jmax
          do i = imin, imax
            adphihydc(i,j) = adphihydc(i,j)+advarloc(i,j)
            advarloc(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine adcalc_grad_phi_surf( bi, bj, imin, imax, jmin, jmax, 
     $adetafld, adphisurfx, adphisurfy )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision bo_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision phi0surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_bo(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision topoz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /surf_fixed/ bo_surf, recip_bo, topoz, phi0surf

C==============================================
C declare arguments
C==============================================
      double precision adetafld(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adphisurfx(1-olx:snx+olx,1-oly:sny+oly)
      double precision adphisurfy(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = jmin, jmax
        do i = imin, imax
          adetafld(i,j-1,bi,bj) = adetafld(i,j-1,bi,bj)-adphisurfy(i,j)*
     $recip_dyc(i,j,bi,bj)*bo_surf(i,j-1,bi,bj)
          adetafld(i,j,bi,bj) = adetafld(i,j,bi,bj)+adphisurfy(i,j)*
     $recip_dyc(i,j,bi,bj)*bo_surf(i,j,bi,bj)
          adphisurfy(i,j) = 0.d0
        end do
      end do
      do j = jmin, jmax
        do i = imin, imax
          adetafld(i-1,j,bi,bj) = adetafld(i-1,j,bi,bj)-adphisurfx(i,j)*
     $recip_dxc(i,j,bi,bj)*bo_surf(i-1,j,bi,bj)
          adetafld(i,j,bi,bj) = adetafld(i,j,bi,bj)+adphisurfx(i,j)*
     $recip_dxc(i,j,bi,bj)*bo_surf(i,j,bi,bj)
          adphisurfx(i,j) = 0.d0
        end do
      end do

      end

      subroutine adcalc_gs( bi, bj, imin, imax, jmin, jmax, k, kup, 
     $kdown, xa, ya, maskup, ufld, adufld, vfld, advfld, wfld, adwfld, 
     $utrans, adutrans, vtrans, advtrans, rtrans, adrtrans, rtranskp1, 
     $adrtranskp1, kappars, adkappars, adfvers, myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer gad_salinity
      parameter ( gad_salinity = 2 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      logical adamsbashforth_s
      logical adamsbashforth_t
      logical adamsbashforthgs
      logical adamsbashforthgt
      logical saltmultidimadvec
      logical saltsom_advection
      logical tempmultidimadvec
      logical tempsom_advection
      common /gad_parm_l/ tempsom_advection, saltsom_advection, 
     $tempmultidimadvec, saltmultidimadvec, adamsbashforthgt, 
     $adamsbashforthgs, adamsbashforth_t, adamsbashforth_s

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer dphinhstatus
      integer mom_startab
      integer nchecklev
      integer nhydstartab
      integer saltstartab
      integer tempstartab
      common /restart_i/ nchecklev, tempstartab, saltstartab, 
     $mom_startab, nhydstartab, dphinhstatus

C==============================================
C declare arguments
C==============================================
      double precision adfvers(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision adkappars(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrtranskp1(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k
      double precision kappars(1-olx:snx+olx,1-oly:sny+oly)
      integer kdown
      integer kup
      double precision maskup(1-olx:snx+olx,1-oly:sny+oly)
      integer myiter
      integer mythid
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision rtranskp1(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      logical calcadvection
      integer iternb

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      calcadvection = saltadvection .and. ( .not. saltmultidimadvec)
      iternb = myiter
      if (staggertimestep) then
        iternb = myiter-1
      endif
      if (saltforcing .and. tracforcingoutab .eq. 1) then
        call adexternal_forcing_s( bi,bj,k )
      endif
      if (adamsbashforthgs) then
        call adadams_bashforth2( bi,bj,k,adgs,adgsnm1,saltstartab,
     $iternb )
      endif
      if (saltforcing .and. tracforcingoutab .ne. 1) then
        call adexternal_forcing_s( bi,bj,k )
      endif
      call adgad_calc_rhs( bi,bj,imin,imax,jmin,jmax,k,kup,kdown,xa,ya,
     $maskup,ufld,adufld,vfld,advfld,wfld,adwfld,utrans,adutrans,vtrans,
     $advtrans,rtrans,adrtrans,rtranskp1,adrtranskp1,diffkhs,diffk4s,
     $kappars,adkappars,gsnm1,adgsnm1,salt,adsalt,dttracerlev,
     $gad_salinity,saltadvscheme,saltvertadvscheme,calcadvection,
     $saltimplvertadv,adamsbashforth_s,usegmredi,adfvers,adgs,mythid )

      end

      subroutine mdcalc_gs( bi, bj, imin, imax, jmin, jmax, k, km1, kup,
     $ kdown, xa, ya, maskup, ufld, vfld, wfld, utrans, vtrans, rtrans, 
     $rtranskp1, kappars, fvers, mytime, myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer gad_salinity
      parameter ( gad_salinity = 2 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      logical adamsbashforth_s
      logical adamsbashforth_t
      logical adamsbashforthgs
      logical adamsbashforthgt
      logical saltmultidimadvec
      logical saltsom_advection
      logical tempmultidimadvec
      logical tempsom_advection
      common /gad_parm_l/ tempsom_advection, saltsom_advection, 
     $tempmultidimadvec, saltmultidimadvec, adamsbashforthgt, 
     $adamsbashforthgs, adamsbashforth_t, adamsbashforth_s

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer dphinhstatus
      integer mom_startab
      integer nchecklev
      integer nhydstartab
      integer saltstartab
      integer tempstartab
      common /restart_i/ nchecklev, tempstartab, saltstartab, 
     $mom_startab, nhydstartab, dphinhstatus

C==============================================
C declare arguments
C==============================================
      integer bi
      integer bj
      double precision fvers(1-olx:snx+olx,1-oly:sny+oly,2)
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k
      double precision kappars(1-olx:snx+olx,1-oly:sny+oly)
      integer kdown
      integer km1
      integer kup
      double precision maskup(1-olx:snx+olx,1-oly:sny+oly)
      integer myiter
      integer mythid
      double precision mytime
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision rtranskp1(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      logical calcadvection
      integer iternb

C**********************************************
C executable statements of routine
C**********************************************
      fvers(1,1,kdown) = fvers(1,1,kdown)
      calcadvection = saltadvection .and. ( .not. saltmultidimadvec)
      iternb = myiter
      if (staggertimestep) then
        iternb = myiter-1
      endif
      call mdgad_calc_rhs( bi,bj,imin,imax,jmin,jmax,k,km1,kup,kdown,xa,
     $ya,maskup,ufld,vfld,wfld,utrans,vtrans,rtrans,rtranskp1,diffkhs,
     $diffk4s,kappars,gsnm1,salt,dttracerlev,gad_salinity,saltadvscheme,
     $saltvertadvscheme,calcadvection,saltimplvertadv,adamsbashforth_s,
     $usegmredi,usekpp,fvers,gs,mytime,myiter,mythid )
      if (saltforcing .and. tracforcingoutab .ne. 1) then
        call external_forcing_s( imin,imax,jmin,jmax,bi,bj,k,mytime,
     $mythid )
      endif
      if (adamsbashforthgs) then
        call adams_bashforth2( bi,bj,k,gs,gsnm1,saltstartab,iternb,
     $mythid )
      endif
      if (saltforcing .and. tracforcingoutab .eq. 1) then
        call external_forcing_s( imin,imax,jmin,jmax,bi,bj,k,mytime,
     $mythid )
      endif
      end

      subroutine adcalc_gt( bi, bj, imin, imax, jmin, jmax, k, kup, 
     $kdown, xa, ya, maskup, ufld, adufld, vfld, advfld, wfld, adwfld, 
     $utrans, adutrans, vtrans, advtrans, rtrans, adrtrans, rtranskp1, 
     $adrtranskp1, kappart, adkappart, adfvert, myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer gad_temperature
      parameter ( gad_temperature = 1 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      logical adamsbashforth_s
      logical adamsbashforth_t
      logical adamsbashforthgs
      logical adamsbashforthgt
      logical saltmultidimadvec
      logical saltsom_advection
      logical tempmultidimadvec
      logical tempsom_advection
      common /gad_parm_l/ tempsom_advection, saltsom_advection, 
     $tempmultidimadvec, saltmultidimadvec, adamsbashforthgt, 
     $adamsbashforthgs, adamsbashforth_t, adamsbashforth_s

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer dphinhstatus
      integer mom_startab
      integer nchecklev
      integer nhydstartab
      integer saltstartab
      integer tempstartab
      common /restart_i/ nchecklev, tempstartab, saltstartab, 
     $mom_startab, nhydstartab, dphinhstatus

C==============================================
C declare arguments
C==============================================
      double precision adfvert(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision adkappart(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrtranskp1(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k
      double precision kappart(1-olx:snx+olx,1-oly:sny+oly)
      integer kdown
      integer kup
      double precision maskup(1-olx:snx+olx,1-oly:sny+oly)
      integer myiter
      integer mythid
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision rtranskp1(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      logical calcadvection
      integer iternb

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      calcadvection = tempadvection .and. ( .not. tempmultidimadvec)
      iternb = myiter
      if (staggertimestep) then
        iternb = myiter-1
      endif
      if (tempforcing .and. tracforcingoutab .eq. 1) then
        call adexternal_forcing_t( bi,bj,k )
      endif
      if (adamsbashforthgt) then
        call adadams_bashforth2( bi,bj,k,adgt,adgtnm1,tempstartab,
     $iternb )
      endif
      if (tempforcing .and. tracforcingoutab .ne. 1) then
        call adexternal_forcing_t( bi,bj,k )
      endif
      call adgad_calc_rhs( bi,bj,imin,imax,jmin,jmax,k,kup,kdown,xa,ya,
     $maskup,ufld,adufld,vfld,advfld,wfld,adwfld,utrans,adutrans,vtrans,
     $advtrans,rtrans,adrtrans,rtranskp1,adrtranskp1,diffkht,diffk4t,
     $kappart,adkappart,gtnm1,adgtnm1,theta,adtheta,dttracerlev,
     $gad_temperature,tempadvscheme,tempvertadvscheme,calcadvection,
     $tempimplvertadv,adamsbashforth_t,usegmredi,adfvert,adgt,mythid )

      end

      subroutine mdcalc_gt( bi, bj, imin, imax, jmin, jmax, k, km1, kup,
     $ kdown, xa, ya, maskup, ufld, vfld, wfld, utrans, vtrans, rtrans, 
     $rtranskp1, kappart, fvert, mytime, myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer gad_temperature
      parameter ( gad_temperature = 1 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      logical adamsbashforth_s
      logical adamsbashforth_t
      logical adamsbashforthgs
      logical adamsbashforthgt
      logical saltmultidimadvec
      logical saltsom_advection
      logical tempmultidimadvec
      logical tempsom_advection
      common /gad_parm_l/ tempsom_advection, saltsom_advection, 
     $tempmultidimadvec, saltmultidimadvec, adamsbashforthgt, 
     $adamsbashforthgs, adamsbashforth_t, adamsbashforth_s

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer dphinhstatus
      integer mom_startab
      integer nchecklev
      integer nhydstartab
      integer saltstartab
      integer tempstartab
      common /restart_i/ nchecklev, tempstartab, saltstartab, 
     $mom_startab, nhydstartab, dphinhstatus

C==============================================
C declare arguments
C==============================================
      integer bi
      integer bj
      double precision fvert(1-olx:snx+olx,1-oly:sny+oly,2)
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k
      double precision kappart(1-olx:snx+olx,1-oly:sny+oly)
      integer kdown
      integer km1
      integer kup
      double precision maskup(1-olx:snx+olx,1-oly:sny+oly)
      integer myiter
      integer mythid
      double precision mytime
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision rtranskp1(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      logical calcadvection
      integer iternb

C**********************************************
C executable statements of routine
C**********************************************
      fvert(1,1,kdown) = fvert(1,1,kdown)
      calcadvection = tempadvection .and. ( .not. tempmultidimadvec)
      iternb = myiter
      if (staggertimestep) then
        iternb = myiter-1
      endif
      call mdgad_calc_rhs( bi,bj,imin,imax,jmin,jmax,k,km1,kup,kdown,xa,
     $ya,maskup,ufld,vfld,wfld,utrans,vtrans,rtrans,rtranskp1,diffkht,
     $diffk4t,kappart,gtnm1,theta,dttracerlev,gad_temperature,
     $tempadvscheme,tempvertadvscheme,calcadvection,tempimplvertadv,
     $adamsbashforth_t,usegmredi,usekpp,fvert,gt,mytime,myiter,mythid )
      if (tempforcing .and. tracforcingoutab .ne. 1) then
        call external_forcing_t( imin,imax,jmin,jmax,bi,bj,k,mytime,
     $mythid )
      endif
      if (adamsbashforthgt) then
        call adams_bashforth2( bi,bj,k,gt,gtnm1,tempstartab,iternb,
     $mythid )
      endif
      if (tempforcing .and. tracforcingoutab .eq. 1) then
        call external_forcing_t( imin,imax,jmin,jmax,bi,bj,k,mytime,
     $mythid )
      endif
      end

      subroutine adcalc_phi_hyd( bi, bj, imin, imax, jmin, jmax, k, 
     $tfld, adtfld, sfld, adsfld, adphihydf, adphihydc, addphihydx, 
     $addphihydy, myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      double precision half
      parameter ( half = 0.5d0 )
      integer max_len_fnam
      parameter ( max_len_fnam = 512 )
      integer max_len_prec
      parameter ( max_len_prec = 200 )
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision one
      parameter ( one = 1.d0 )
      double precision zero
      parameter ( zero = 0.d0 )

C==============================================
C declare common blocks
C==============================================
      double precision adrhoinsitu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision adtotphihyd(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      common /addynvars_diag/ adtotphihyd, adrhoinsitu

      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      real*8 comlev1_bibj_k_sfld_42h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadsfld/ comlev1_bibj_k_sfld_42h

      real*8 comlev1_bibj_k_sfld_40h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadsfle/ comlev1_bibj_k_sfld_40h

      real*8 comlev1_bibj_k_tfld_41h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadtfld/ comlev1_bibj_k_tfld_41h

      real*8 comlev1_bibj_k_tfld_39h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadtfle/ comlev1_bibj_k_tfld_39h

      double precision hmixlayer(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ivdconvcount(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision phihydlow(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rhoinsitu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision totphihyd(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_diag/ phihydlow, totphihyd, rhoinsitu, hmixlayer, 
     $ivdconvcount

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      integer klowc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_i/ ksurfc, ksurfw, ksurfs, klowc

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision atm_cp
      double precision atm_kappa
      double precision atm_po
      double precision atm_rd
      double precision atm_rq
      double precision celsius2k
      integer integr_geopot
      integer selectfindrosurf
      common /parm_atm/ celsius2k, atm_cp, atm_rd, atm_kappa, atm_rq, 
     $atm_po, integr_geopot, selectfindrosurf

      character*(max_len_fnam) bathyfile
      character*(max_len_fnam) buoyancyrelation
      character*(max_len_fnam) delrcfile
      character*(max_len_fnam) delrfile
      character*(max_len_fnam) delxfile
      character*(max_len_fnam) delyfile
      character*(max_len_fnam) diffkrfile
      character*(max_len_fnam) dqdtfile
      character*(max_len_fnam) eddypsixfile
      character*(max_len_fnam) eddypsiyfile
      character*(max_len_fnam) empmrfile
      character*(6) eostype
      character*(max_len_fnam) horizgridfile
      character*(max_len_fnam) hybsigmfile
      character*(max_len_fnam) hydrogsaltfile
      character*(max_len_fnam) hydrogthetafile
      character*(max_len_fnam) lambdasaltfile
      character*(max_len_fnam) lambdathetafile
      character*(max_len_fnam) mdsiolocaldir
      character*(max_len_fnam) meridwindfile
      character*(10) pickupsuff
      character*(max_len_fnam) ploadfile
      character*(max_len_fnam) psurfinitfile
      character*(max_len_fnam) rhoreffile
      character*(max_len_fnam) saltclimfile
      character*(max_len_fnam) saltfluxfile
      character*(max_len_fnam) sreffile
      character*(max_len_fnam) surfqfile
      character*(max_len_fnam) surfqnetfile
      character*(max_len_fnam) surfqswfile
      character*(max_len_prec/2) the_run_name
      character*(max_len_fnam) thetaclimfile
      character*(max_len_fnam) topofile
      character*(max_len_fnam) treffile
      character*(max_len_fnam) uvelinitfile
      character*(max_len_fnam) visca4dfile
      character*(max_len_fnam) visca4zfile
      character*(max_len_fnam) viscahdfile
      character*(max_len_fnam) viscahzfile
      character*(max_len_fnam) vvelinitfile
      character*(max_len_fnam) zonalwindfile
      common /parm_c/ buoyancyrelation, eostype, pickupsuff, 
     $mdsiolocaldir, treffile, sreffile, rhoreffile, delrfile, 
     $delrcfile, hybsigmfile, delxfile, delyfile, horizgridfile, 
     $bathyfile, topofile, viscahdfile, viscahzfile, visca4dfile, 
     $visca4zfile, hydrogthetafile, hydrogsaltfile, diffkrfile, 
     $zonalwindfile, meridwindfile, thetaclimfile, saltclimfile, 
     $empmrfile, saltfluxfile, surfqfile, surfqnetfile, surfqswfile, 
     $lambdathetafile, lambdasaltfile, uvelinitfile, vvelinitfile, 
     $psurfinitfile, dqdtfile, ploadfile, eddypsixfile, eddypsiyfile, 
     $the_run_name

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

      integer ikey
      integer key
      common /tamckeys/ key, ikey

C==============================================
C declare arguments
C==============================================
      double precision addphihydx(1-olx:snx+olx,1-oly:sny+oly)
      double precision addphihydy(1-olx:snx+olx,1-oly:sny+oly)
      double precision adphihydc(1-olx:snx+olx,1-oly:sny+oly)
      double precision adphihydf(1-olx:snx+olx,1-oly:sny+oly)
      double precision adsfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k
      integer myiter
      integer mythid
      double precision sfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision tfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)

C==============================================
C declare local variables
C==============================================
      integer act1
      integer act2
      integer act3
      integer act4
      double precision adalpharho(1-olx:snx+olx,1-oly:sny+oly)
      double precision adlocalpha
      double precision alpharho(1-olx:snx+olx,1-oly:sny+oly)
      double precision ddpim
      double precision ddpip
      double precision ddrloc
      double precision drlocm
      double precision drlocp
      integer i
      integer ip1
      integer ip2
      integer j
      integer kkey
      double precision localpha
      integer max1
      integer max2
      integer max3
      double precision rec_drm
      double precision rec_drp

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adalpharho(ip1,ip2) = 0.d0
        end do
      end do
      adlocalpha = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      act1 = bi-mybxlo(mythid)
      max1 = mybxhi(mythid)-mybxlo(mythid)+1
      act2 = bj-mybylo(mythid)
      max2 = mybyhi(mythid)-mybylo(mythid)+1
      act3 = mythid-1
      max3 = ntx*nty
      act4 = ikey_dynamics-1
      ikey = act1+1+act2*max1+act3*max1*max2+act4*max1*max2*max3
      if (mompressureforcing) then
        call adcalc_grad_phi_hyd( k,bi,bj,imin,imax,jmin,jmax,adphihydc,
     $addphihydx,addphihydy )
      endif
      call addiags_phi_hyd( k,bi,bj,imin,imax,jmin,jmax,adphihydc )
      if (buoyancyrelation .eq. 'OCEANIC') then
        if (integr_geopot .eq. 1) then
          do j = jmin, jmax
            do i = imin, imax
              adalpharho(i,j) = adalpharho(i,j)+adphihydf(i,j)*drf(k)*
     $gravity*recip_rhoconst
              adalpharho(i,j) = adalpharho(i,j)+adphihydc(i,j)*half*drf(
     $k)*gravity*recip_rhoconst
              adphihydf(i,j) = adphihydf(i,j)+adphihydc(i,j)
              adphihydc(i,j) = 0.d0
            end do
          end do
        else
          drlocm = half*drc(k)
          if (k .eq. 1) then
            drlocm = rf(k)-rc(k)
          endif
          if (k .eq. nr) then
            drlocp = rc(k)-rf(k+1)
          else
            drlocp = half*drc(k+1)
          endif
          do j = jmin, jmax
            do i = imin, imax
              adalpharho(i,j) = adalpharho(i,j)+adphihydf(i,j)*drlocp*
     $gravity*recip_rhoconst
              adphihydc(i,j) = adphihydc(i,j)+adphihydf(i,j)
              adphihydf(i,j) = 0.d0
              adalpharho(i,j) = adalpharho(i,j)+adphihydc(i,j)*drlocm*
     $gravity*recip_rhoconst
              adphihydf(i,j) = adphihydf(i,j)+adphihydc(i,j)
              adphihydc(i,j) = 0.d0
            end do
          end do
        endif
        if (quasihydrostatic) then
          call admom_quasihydrostatic( bi,bj,k,uvel,aduvel,vvel,advvel,
     $adalpharho )
        endif
        if (implicitintgravwave .or. myiter .lt. 0) then
          kkey = (ikey-1)*nr+k
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              tfld(ip1,ip2,k,bi,bj) = comlev1_bibj_k_tfld_39h(ip1,ip2,
     $kkey)
            end do
          end do
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              sfld(ip1,ip2,k,bi,bj) = comlev1_bibj_k_sfld_40h(ip1,ip2,
     $kkey)
            end do
          end do
          call adfind_rho_2d( imin,imax,jmin,jmax,k,tfld(1-olx,1-oly,k,
     $bi,bj),adtfld(1-olx,1-oly,k,bi,bj),sfld(1-olx,1-oly,k,bi,bj),
     $adsfld(1-olx,1-oly,k,bi,bj),adalpharho,bi,bj )
        else
          do j = jmin, jmax
            do i = imin, imax
              adrhoinsitu(i,j,k,bi,bj) = adrhoinsitu(i,j,k,bi,bj)+
     $adalpharho(i,j)
              adalpharho(i,j) = 0.d0
            end do
          end do
        endif
      else if (buoyancyrelation .eq. 'OCEANICP') then
        if (implicitintgravwave .or. myiter .lt. 0) then
          call find_rho_2d( imin,imax,jmin,jmax,k,tfld(1-olx,1-oly,k,bi,
     $bj),sfld(1-olx,1-oly,k,bi,bj),alpharho,k,bi,bj,mythid )
        else
          do j = jmin, jmax
            do i = imin, imax
              alpharho(i,j) = rhoinsitu(i,j,k,bi,bj)
            end do
          end do
        endif
        if (integr_geopot .eq. 1) then
          do j = jmin, jmax
            do i = imin, imax
              adalpharho(i,j) = adalpharho(i,j)+adphihydf(i,j)*half*drf(
     $k)
              adphihydc(i,j) = adphihydc(i,j)+adphihydf(i,j)
              adphihydf(i,j) = 0.d0
              if (k .eq. ksurfc(i,j,bi,bj)) then
                ddrloc = ro_surf(i,j,bi,bj)-rc(k)
                adalpharho(i,j) = adalpharho(i,j)+adphihydc(i,j)*ddrloc
                adphihydc(i,j) = 0.d0
              else
                adalpharho(i,j) = adalpharho(i,j)+adphihydc(i,j)*half*
     $drf(k)
                adphihydf(i,j) = adphihydf(i,j)+adphihydc(i,j)
                adphihydc(i,j) = 0.d0
              endif
            end do
          end do
        else
          drlocm = half*drc(k)
          if (k .eq. 1) then
            drlocm = rf(k)-rc(k)
          endif
          if (k .eq. nr) then
            drlocp = rc(k)-rf(k+1)
          else
            drlocp = half*drc(k+1)
          endif
          rec_drm = one/(rf(k)-rc(k))
          rec_drp = one/(rc(k)-rf(k+1))
          do j = jmin, jmax
            do i = imin, imax
              adalpharho(i,j) = adalpharho(i,j)+adphihydf(i,j)*drlocp
              adphihydc(i,j) = adphihydc(i,j)+adphihydf(i,j)
              adphihydf(i,j) = 0.d0
              if (k .eq. ksurfc(i,j,bi,bj)) then
                ddrloc = ro_surf(i,j,bi,bj)-rc(k)
                adalpharho(i,j) = adalpharho(i,j)+adphihydc(i,j)*(
     $rec_drm*drlocm*max(zero,ddrloc)+rec_drp*drlocp*min(zero,ddrloc))
                adphihydc(i,j) = 0.d0
              else
                adalpharho(i,j) = adalpharho(i,j)+adphihydc(i,j)*drlocm
                adphihydf(i,j) = adphihydf(i,j)+adphihydc(i,j)
                adphihydc(i,j) = 0.d0
              endif
            end do
          end do
        endif
        do j = jmax, jmin, -1
          adlocalpha = 0.d0
          do i = imax, imin, -1
            adlocalpha = 0.d0
            localpha = alpharho(i,j)+rhoconst
            adlocalpha = adlocalpha-adalpharho(i,j)*maskc(i,j,k,bi,bj)*(
     $one/(localpha*localpha))
            adalpharho(i,j) = 0.d0
            adalpharho(i,j) = adalpharho(i,j)+adlocalpha
            adlocalpha = 0.d0
          end do
        end do
        if (implicitintgravwave .or. myiter .lt. 0) then
          kkey = (ikey-1)*nr+k
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              tfld(ip1,ip2,k,bi,bj) = comlev1_bibj_k_tfld_41h(ip1,ip2,
     $kkey)
            end do
          end do
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              sfld(ip1,ip2,k,bi,bj) = comlev1_bibj_k_sfld_42h(ip1,ip2,
     $kkey)
            end do
          end do
          call adfind_rho_2d( imin,imax,jmin,jmax,k,tfld(1-olx,1-oly,k,
     $bi,bj),adtfld(1-olx,1-oly,k,bi,bj),sfld(1-olx,1-oly,k,bi,bj),
     $adsfld(1-olx,1-oly,k,bi,bj),adalpharho,bi,bj )
        else
          do j = jmin, jmax
            do i = imin, imax
              adrhoinsitu(i,j,k,bi,bj) = adrhoinsitu(i,j,k,bi,bj)+
     $adalpharho(i,j)
              adalpharho(i,j) = 0.d0
            end do
          end do
        endif
      else if (buoyancyrelation .eq. 'ATMOSPHERIC') then
        if (integr_geopot .eq. 0) then
          if (k .eq. 1) then
            ddpim = atm_cp*((rf(k)/atm_po)**atm_kappa-(rc(k)/atm_po)**
     $atm_kappa)
          else
            ddpim = atm_cp*((rc(k-1)/atm_po)**atm_kappa-(rc(k)/atm_po)**
     $atm_kappa)*half
          endif
          if (k .eq. nr) then
            ddpip = atm_cp*((rc(k)/atm_po)**atm_kappa-(rf(k+1)/atm_po)**
     $atm_kappa)
          else
            ddpip = atm_cp*((rc(k)/atm_po)**atm_kappa-(rc(k+1)/atm_po)**
     $atm_kappa)*half
          endif
          do j = jmin, jmax
            do i = imin, imax
              adalpharho(i,j) = adalpharho(i,j)+adphihydf(i,j)*ddpip
              adphihydc(i,j) = adphihydc(i,j)+adphihydf(i,j)
              adphihydf(i,j) = 0.d0
              adalpharho(i,j) = adalpharho(i,j)+adphihydc(i,j)*ddpim
              adphihydf(i,j) = adphihydf(i,j)+adphihydc(i,j)
              adphihydc(i,j) = 0.d0
            end do
          end do
        else if (integr_geopot .eq. 1) then
          ddpim = atm_cp*((rf(k)/atm_po)**atm_kappa-(rc(k)/atm_po)**
     $atm_kappa)
          ddpip = atm_cp*((rc(k)/atm_po)**atm_kappa-(rf(k+1)/atm_po)**
     $atm_kappa)
          do j = jmin, jmax
            do i = imin, imax
              adalpharho(i,j) = adalpharho(i,j)+adphihydf(i,j)*ddpip
              adphihydc(i,j) = adphihydc(i,j)+adphihydf(i,j)
              adphihydf(i,j) = 0.d0
              if (k .eq. ksurfc(i,j,bi,bj)) then
                ddrloc = ro_surf(i,j,bi,bj)-rc(k)
                adalpharho(i,j) = adalpharho(i,j)+2*adphihydc(i,j)*
     $ddrloc*recip_drf(k)*ddpim
                adphihydc(i,j) = 0.d0
              else
                adalpharho(i,j) = adalpharho(i,j)+adphihydc(i,j)*ddpim
                adphihydf(i,j) = adphihydf(i,j)+adphihydc(i,j)
                adphihydc(i,j) = 0.d0
              endif
            end do
          end do
        else if (integr_geopot .eq. 2 .or. integr_geopot .eq. 3) then
          if (k .eq. 1) then
            ddpim = atm_cp*((rf(k)/atm_po)**atm_kappa-(rc(k)/atm_po)**
     $atm_kappa)
          else
            ddpim = atm_cp*((rc(k-1)/atm_po)**atm_kappa-(rc(k)/atm_po)**
     $atm_kappa)*half
          endif
          if (k .eq. nr) then
            ddpip = atm_cp*((rc(k)/atm_po)**atm_kappa-(rf(k+1)/atm_po)**
     $atm_kappa)
          else
            ddpip = atm_cp*((rc(k)/atm_po)**atm_kappa-(rc(k+1)/atm_po)**
     $atm_kappa)*half
          endif
          rec_drm = one/(rf(k)-rc(k))
          rec_drp = one/(rc(k)-rf(k+1))
          do j = jmin, jmax
            do i = imin, imax
              adalpharho(i,j) = adalpharho(i,j)+adphihydf(i,j)*ddpip
              adphihydc(i,j) = adphihydc(i,j)+adphihydf(i,j)
              adphihydf(i,j) = 0.d0
              if (k .eq. ksurfc(i,j,bi,bj)) then
                ddrloc = ro_surf(i,j,bi,bj)-rc(k)
                adalpharho(i,j) = adalpharho(i,j)+adphihydc(i,j)*(
     $rec_drm*ddpim*max(zero,ddrloc)+rec_drp*ddpip*min(zero,ddrloc))
                adphihydc(i,j) = 0.d0
              else
                adalpharho(i,j) = adalpharho(i,j)+adphihydc(i,j)*ddpim
                adphihydf(i,j) = adphihydf(i,j)+adphihydc(i,j)
                adphihydc(i,j) = 0.d0
              endif
            end do
          end do
        endif
        do j = jmin, jmax
          do i = imin, imax
            adsfld(i,j,k,bi,bj) = adsfld(i,j,k,bi,bj)+adalpharho(i,j)*
     $maskc(i,j,k,bi,bj)*tfld(i,j,k,bi,bj)*atm_rq
            adtfld(i,j,k,bi,bj) = adtfld(i,j,k,bi,bj)+adalpharho(i,j)*
     $maskc(i,j,k,bi,bj)*(sfld(i,j,k,bi,bj)*atm_rq+one)
            adalpharho(i,j) = 0.d0
          end do
        end do
      endif
      if (k .eq. 1) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adphihydf(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine mdcalc_phi_hyd( bi, bj, imin, imax, jmin, jmax, k, 
     $tfld, sfld, phihydf, phihydc, dphihydx, dphihydy, mytime, myiter, 
     $mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      double precision half
      parameter ( half = 0.5d0 )
      integer max_len_fnam
      parameter ( max_len_fnam = 512 )
      integer max_len_prec
      parameter ( max_len_prec = 200 )
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision one
      parameter ( one = 1.d0 )
      double precision zero
      parameter ( zero = 0.d0 )

C==============================================
C declare common blocks
C==============================================
      real*8 comlev1_bibj_k_alpharho_43h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadalpharho/ comlev1_bibj_k_alpharho_43h

      real*8 comlev1_bibj_k_sfld_42h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadsfld/ comlev1_bibj_k_sfld_42h

      real*8 comlev1_bibj_k_sfld_40h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadsfle/ comlev1_bibj_k_sfld_40h

      real*8 comlev1_bibj_k_tfld_41h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadtfld/ comlev1_bibj_k_tfld_41h

      real*8 comlev1_bibj_k_tfld_39h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadtfle/ comlev1_bibj_k_tfld_39h

      double precision hmixlayer(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ivdconvcount(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision phihydlow(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rhoinsitu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision totphihyd(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_diag/ phihydlow, totphihyd, rhoinsitu, hmixlayer, 
     $ivdconvcount

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      integer klowc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_i/ ksurfc, ksurfw, ksurfs, klowc

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision atm_cp
      double precision atm_kappa
      double precision atm_po
      double precision atm_rd
      double precision atm_rq
      double precision celsius2k
      integer integr_geopot
      integer selectfindrosurf
      common /parm_atm/ celsius2k, atm_cp, atm_rd, atm_kappa, atm_rq, 
     $atm_po, integr_geopot, selectfindrosurf

      character*(max_len_fnam) bathyfile
      character*(max_len_fnam) buoyancyrelation
      character*(max_len_fnam) delrcfile
      character*(max_len_fnam) delrfile
      character*(max_len_fnam) delxfile
      character*(max_len_fnam) delyfile
      character*(max_len_fnam) diffkrfile
      character*(max_len_fnam) dqdtfile
      character*(max_len_fnam) eddypsixfile
      character*(max_len_fnam) eddypsiyfile
      character*(max_len_fnam) empmrfile
      character*(6) eostype
      character*(max_len_fnam) horizgridfile
      character*(max_len_fnam) hybsigmfile
      character*(max_len_fnam) hydrogsaltfile
      character*(max_len_fnam) hydrogthetafile
      character*(max_len_fnam) lambdasaltfile
      character*(max_len_fnam) lambdathetafile
      character*(max_len_fnam) mdsiolocaldir
      character*(max_len_fnam) meridwindfile
      character*(10) pickupsuff
      character*(max_len_fnam) ploadfile
      character*(max_len_fnam) psurfinitfile
      character*(max_len_fnam) rhoreffile
      character*(max_len_fnam) saltclimfile
      character*(max_len_fnam) saltfluxfile
      character*(max_len_fnam) sreffile
      character*(max_len_fnam) surfqfile
      character*(max_len_fnam) surfqnetfile
      character*(max_len_fnam) surfqswfile
      character*(max_len_prec/2) the_run_name
      character*(max_len_fnam) thetaclimfile
      character*(max_len_fnam) topofile
      character*(max_len_fnam) treffile
      character*(max_len_fnam) uvelinitfile
      character*(max_len_fnam) visca4dfile
      character*(max_len_fnam) visca4zfile
      character*(max_len_fnam) viscahdfile
      character*(max_len_fnam) viscahzfile
      character*(max_len_fnam) vvelinitfile
      character*(max_len_fnam) zonalwindfile
      common /parm_c/ buoyancyrelation, eostype, pickupsuff, 
     $mdsiolocaldir, treffile, sreffile, rhoreffile, delrfile, 
     $delrcfile, hybsigmfile, delxfile, delyfile, horizgridfile, 
     $bathyfile, topofile, viscahdfile, viscahzfile, visca4dfile, 
     $visca4zfile, hydrogthetafile, hydrogsaltfile, diffkrfile, 
     $zonalwindfile, meridwindfile, thetaclimfile, saltclimfile, 
     $empmrfile, saltfluxfile, surfqfile, surfqnetfile, surfqswfile, 
     $lambdathetafile, lambdasaltfile, uvelinitfile, vvelinitfile, 
     $psurfinitfile, dqdtfile, ploadfile, eddypsixfile, eddypsiyfile, 
     $the_run_name

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

      integer ikey
      integer key
      common /tamckeys/ key, ikey

C==============================================
C declare arguments
C==============================================
      integer bi
      integer bj
      double precision dphihydx(1-olx:snx+olx,1-oly:sny+oly)
      double precision dphihydy(1-olx:snx+olx,1-oly:sny+oly)
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k
      integer myiter
      integer mythid
      double precision mytime
      double precision phihydc(1-olx:snx+olx,1-oly:sny+oly)
      double precision phihydf(1-olx:snx+olx,1-oly:sny+oly)
      double precision sfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision tfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)

C==============================================
C declare local variables
C==============================================
      integer act1
      integer act2
      integer act3
      integer act4
      double precision alpharho(1-olx:snx+olx,1-oly:sny+oly)
      double precision ddpim
      double precision ddpip
      double precision ddrloc
      double precision drlocm
      double precision drlocp
      integer i
      integer iqa
      integer iqb
      integer iqc
      integer iqd
      integer iqe
      integer iqf
      integer iqg
      integer iqh
      integer iqi
      integer iqj
      integer j
      integer kkey
      double precision localpha
      integer max1
      integer max2
      integer max3
      double precision rec_drm
      double precision rec_drp

C**********************************************
C executable statements of routine
C**********************************************
      act1 = bi-mybxlo(mythid)
      max1 = mybxhi(mythid)-mybxlo(mythid)+1
      act2 = bj-mybylo(mythid)
      max2 = mybyhi(mythid)-mybylo(mythid)+1
      act3 = mythid-1
      max3 = ntx*nty
      act4 = ikey_dynamics-1
      ikey = act1+1+act2*max1+act3*max1*max2+act4*max1*max2*max3
      if (k .eq. 1) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            phihydf(i,j) = 0.
          end do
        end do
      endif
      if (buoyancyrelation .eq. 'OCEANIC') then
        if (implicitintgravwave .or. myiter .lt. 0) then
          kkey = (ikey-1)*nr+k
          do iqd = 1-oly, sny+oly
            do iqc = 1-olx, snx+olx
              comlev1_bibj_k_tfld_39h(iqc,iqd,kkey) = tfld(iqc,iqd,k,bi,
     $bj)
            end do
          end do
          do iqb = 1-oly, sny+oly
            do iqa = 1-olx, snx+olx
              comlev1_bibj_k_sfld_40h(iqa,iqb,kkey) = sfld(iqa,iqb,k,bi,
     $bj)
            end do
          end do
          call find_rho_2d( imin,imax,jmin,jmax,k,tfld(1-olx,1-oly,k,bi,
     $bj),sfld(1-olx,1-oly,k,bi,bj),alpharho,k,bi,bj,mythid )
        else
          do j = jmin, jmax
            do i = imin, imax
              alpharho(i,j) = rhoinsitu(i,j,k,bi,bj)
            end do
          end do
        endif
        if (quasihydrostatic) then
          call mom_quasihydrostatic( bi,bj,k,uvel,vvel,alpharho,mythid )
        endif
        if (integr_geopot .eq. 1) then
          do j = jmin, jmax
            do i = imin, imax
              phihydc(i,j) = phihydf(i,j)+half*drf(k)*gravity*alpharho(
     $i,j)*recip_rhoconst
              phihydf(i,j) = phihydf(i,j)+drf(k)*gravity*alpharho(i,j)*
     $recip_rhoconst
            end do
          end do
        else
          drlocm = half*drc(k)
          if (k .eq. 1) then
            drlocm = rf(k)-rc(k)
          endif
          if (k .eq. nr) then
            drlocp = rc(k)-rf(k+1)
          else
            drlocp = half*drc(k+1)
          endif
          do j = jmin, jmax
            do i = imin, imax
              phihydc(i,j) = phihydf(i,j)+drlocm*gravity*alpharho(i,j)*
     $recip_rhoconst
              phihydf(i,j) = phihydc(i,j)+drlocp*gravity*alpharho(i,j)*
     $recip_rhoconst
            end do
          end do
        endif
      else if (buoyancyrelation .eq. 'OCEANICP') then
        if (implicitintgravwave .or. myiter .lt. 0) then
          kkey = (ikey-1)*nr+k
          do iqj = 1-oly, sny+oly
            do iqi = 1-olx, snx+olx
              comlev1_bibj_k_tfld_41h(iqi,iqj,kkey) = tfld(iqi,iqj,k,bi,
     $bj)
            end do
          end do
          do iqh = 1-oly, sny+oly
            do iqg = 1-olx, snx+olx
              comlev1_bibj_k_sfld_42h(iqg,iqh,kkey) = sfld(iqg,iqh,k,bi,
     $bj)
            end do
          end do
          call find_rho_2d( imin,imax,jmin,jmax,k,tfld(1-olx,1-oly,k,bi,
     $bj),sfld(1-olx,1-oly,k,bi,bj),alpharho,k,bi,bj,mythid )
          do iqf = 1-oly, sny+oly
            do iqe = 1-olx, snx+olx
              comlev1_bibj_k_alpharho_43h(iqe,iqf,kkey) = alpharho(iqe,
     $iqf)
            end do
          end do
        else
          do j = jmin, jmax
            do i = imin, imax
              alpharho(i,j) = rhoinsitu(i,j,k,bi,bj)
            end do
          end do
        endif
        do j = jmin, jmax
          do i = imin, imax
            localpha = alpharho(i,j)+rhoconst
            alpharho(i,j) = maskc(i,j,k,bi,bj)*(one/localpha-
     $recip_rhoconst)
          end do
        end do
        if (integr_geopot .eq. 1) then
          do j = jmin, jmax
            do i = imin, imax
              if (k .eq. ksurfc(i,j,bi,bj)) then
                ddrloc = ro_surf(i,j,bi,bj)-rc(k)
                phihydc(i,j) = ddrloc*alpharho(i,j)
              else
                phihydc(i,j) = phihydf(i,j)+half*drf(k)*alpharho(i,j)
              endif
              phihydf(i,j) = phihydc(i,j)+half*drf(k)*alpharho(i,j)
            end do
          end do
        else
          drlocm = half*drc(k)
          if (k .eq. 1) then
            drlocm = rf(k)-rc(k)
          endif
          if (k .eq. nr) then
            drlocp = rc(k)-rf(k+1)
          else
            drlocp = half*drc(k+1)
          endif
          rec_drm = one/(rf(k)-rc(k))
          rec_drp = one/(rc(k)-rf(k+1))
          do j = jmin, jmax
            do i = imin, imax
              if (k .eq. ksurfc(i,j,bi,bj)) then
                ddrloc = ro_surf(i,j,bi,bj)-rc(k)
                phihydc(i,j) = (max(zero,ddrloc)*rec_drm*drlocm+min(
     $zero,ddrloc)*rec_drp*drlocp)*alpharho(i,j)
              else
                phihydc(i,j) = phihydf(i,j)+drlocm*alpharho(i,j)
              endif
              phihydf(i,j) = phihydc(i,j)+drlocp*alpharho(i,j)
            end do
          end do
        endif
      else if (buoyancyrelation .eq. 'ATMOSPHERIC') then
        do j = jmin, jmax
          do i = imin, imax
            alpharho(i,j) = maskc(i,j,k,bi,bj)*(tfld(i,j,k,bi,bj)*(sfld(
     $i,j,k,bi,bj)*atm_rq+one)-tref(k))
          end do
        end do
        if (integr_geopot .eq. 0) then
          if (k .eq. 1) then
            ddpim = atm_cp*((rf(k)/atm_po)**atm_kappa-(rc(k)/atm_po)**
     $atm_kappa)
          else
            ddpim = atm_cp*((rc(k-1)/atm_po)**atm_kappa-(rc(k)/atm_po)**
     $atm_kappa)*half
          endif
          if (k .eq. nr) then
            ddpip = atm_cp*((rc(k)/atm_po)**atm_kappa-(rf(k+1)/atm_po)**
     $atm_kappa)
          else
            ddpip = atm_cp*((rc(k)/atm_po)**atm_kappa-(rc(k+1)/atm_po)**
     $atm_kappa)*half
          endif
          do j = jmin, jmax
            do i = imin, imax
              phihydc(i,j) = phihydf(i,j)+ddpim*alpharho(i,j)
              phihydf(i,j) = phihydc(i,j)+ddpip*alpharho(i,j)
            end do
          end do
        else if (integr_geopot .eq. 1) then
          ddpim = atm_cp*((rf(k)/atm_po)**atm_kappa-(rc(k)/atm_po)**
     $atm_kappa)
          ddpip = atm_cp*((rc(k)/atm_po)**atm_kappa-(rf(k+1)/atm_po)**
     $atm_kappa)
          do j = jmin, jmax
            do i = imin, imax
              if (k .eq. ksurfc(i,j,bi,bj)) then
                ddrloc = ro_surf(i,j,bi,bj)-rc(k)
                phihydc(i,j) = ddrloc*recip_drf(k)*2.d0*ddpim*alpharho(
     $i,j)
              else
                phihydc(i,j) = phihydf(i,j)+ddpim*alpharho(i,j)
              endif
              phihydf(i,j) = phihydc(i,j)+ddpip*alpharho(i,j)
            end do
          end do
        else if (integr_geopot .eq. 2 .or. integr_geopot .eq. 3) then
          if (k .eq. 1) then
            ddpim = atm_cp*((rf(k)/atm_po)**atm_kappa-(rc(k)/atm_po)**
     $atm_kappa)
          else
            ddpim = atm_cp*((rc(k-1)/atm_po)**atm_kappa-(rc(k)/atm_po)**
     $atm_kappa)*half
          endif
          if (k .eq. nr) then
            ddpip = atm_cp*((rc(k)/atm_po)**atm_kappa-(rf(k+1)/atm_po)**
     $atm_kappa)
          else
            ddpip = atm_cp*((rc(k)/atm_po)**atm_kappa-(rc(k+1)/atm_po)**
     $atm_kappa)*half
          endif
          rec_drm = one/(rf(k)-rc(k))
          rec_drp = one/(rc(k)-rf(k+1))
          do j = jmin, jmax
            do i = imin, imax
              if (k .eq. ksurfc(i,j,bi,bj)) then
                ddrloc = ro_surf(i,j,bi,bj)-rc(k)
                phihydc(i,j) = (max(zero,ddrloc)*rec_drm*ddpim+min(zero,
     $ddrloc)*rec_drp*ddpip)*alpharho(i,j)
              else
                phihydc(i,j) = phihydf(i,j)+ddpim*alpharho(i,j)
              endif
              phihydf(i,j) = phihydc(i,j)+ddpip*alpharho(i,j)
            end do
          end do
        endif
      endif
      call diags_phi_hyd( k,bi,bj,imin,imax,jmin,jmax,phihydc,mytime,
     $myiter,mythid )
      if (mompressureforcing) then
        call calc_grad_phi_hyd( k,bi,bj,imin,imax,jmin,jmax,phihydc,
     $alpharho,tfld,sfld,dphihydx,dphihydy,mytime,myiter,mythid )
      endif
      end

      subroutine adcalc_wsurf_tr( thetafld, adthetafld, saltfld, 
     $adsaltfld, wvelfld, adwvelfld, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adssurfcor
      double precision adtsurfcor
      common /adsurf_correc/ adtsurfcor, adssurfcor

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      integer klowc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_i/ ksurfc, ksurfw, ksurfs, klowc

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adsaltfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adthetafld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision adwvelfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer mythid
      double precision saltfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision thetafld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvelfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)

C==============================================
C declare local variables
C==============================================
      double precision adws_mean
      double precision adws_tile(nsx,nsy)
      double precision adwt_mean
      double precision adwt_tile(nsx,nsy)
      integer bi
      integer bj
      integer i
      integer ip1
      integer ip2
      integer j
      integer ks

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adws_mean = 0.d0
      do ip2 = 1, nsy
        do ip1 = 1, nsx
          adws_tile(ip1,ip2) = 0.d0
        end do
      end do
      adwt_mean = 0.d0
      do ip2 = 1, nsy
        do ip1 = 1, nsx
          adwt_tile(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      call barrier( mythid )
      if (globalarea .gt. 0.) then
        if (mythid .eq. 1) then
          adws_mean = adws_mean+adssurfcor/globalarea
          adssurfcor = 0.d0
          adwt_mean = adwt_mean+adtsurfcor/globalarea
          adtsurfcor = 0.d0
        endif
      endif
      call global_adsum_tile_rl( adws_tile,adws_mean,mythid )
      call global_adsum_tile_rl( adwt_tile,adwt_mean,mythid )
      do bj = mybylo(mythid), mybyhi(mythid)
        do bi = mybxlo(mythid), mybxhi(mythid)
          do j = 1, sny
            do i = 1, snx
              ks = ksurfc(i,j,bi,bj)
              if (ks .le. nr) then
                adsaltfld(i,j,ks,bi,bj) = adsaltfld(i,j,ks,bi,bj)+
     $adws_tile(bi,bj)*ra(i,j,bi,bj)*wvelfld(i,j,ks,bi,bj)
                adwvelfld(i,j,ks,bi,bj) = adwvelfld(i,j,ks,bi,bj)+
     $adws_tile(bi,bj)*ra(i,j,bi,bj)*saltfld(i,j,ks,bi,bj)
                adthetafld(i,j,ks,bi,bj) = adthetafld(i,j,ks,bi,bj)+
     $adwt_tile(bi,bj)*ra(i,j,bi,bj)*wvelfld(i,j,ks,bi,bj)
                adwvelfld(i,j,ks,bi,bj) = adwvelfld(i,j,ks,bi,bj)+
     $adwt_tile(bi,bj)*ra(i,j,bi,bj)*thetafld(i,j,ks,bi,bj)
              endif
            end do
          end do
          adws_tile(bi,bj) = 0.d0
          adwt_tile(bi,bj) = 0.d0
        end do
      end do
      adssurfcor = 0.d0
      adtsurfcor = 0.d0

      end

      subroutine adcd_code_scheme( bi, bj, k, addphihydx, addphihydy, 
     $adgufld, adgvfld, adgucor, adgvcor )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer olx
      parameter ( olx = 2 )
      integer snx
      parameter ( snx = 45 )
      integer imax
      parameter ( imax = snx+olx-1 )
      integer imin
      parameter ( imin = 1-olx+1 )
      integer oly
      parameter ( oly = 2 )
      integer sny
      parameter ( sny = 20 )
      integer jmax
      parameter ( jmax = sny+oly-1 )
      integer jmin
      parameter ( jmin = 1-oly+1 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer ny
      parameter ( ny = sny*nsy*npy )

C==============================================
C declare common blocks
C==============================================
      double precision adetanm1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduveld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advveld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_cd/ aduveld, advveld, adetanm1, adunm1, advnm1

      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      double precision bo_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision phi0surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_bo(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision topoz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /surf_fixed/ bo_surf, recip_bo, topoz, phi0surf

C==============================================
C declare arguments
C==============================================
      double precision addphihydx(1-olx:snx+olx,1-oly:sny+oly)
      double precision addphihydy(1-olx:snx+olx,1-oly:sny+oly)
      double precision adgucor(1-olx:snx+olx,1-oly:sny+oly)
      double precision adgufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adgvcor(1-olx:snx+olx,1-oly:sny+oly)
      double precision adgvfld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k

C==============================================
C declare local variables
C==============================================
      double precision ab05
      double precision ab15
      double precision adaf(1-olx:snx+olx,1-oly:sny+oly)
      double precision adpf(1-olx:snx+olx,1-oly:sny+oly)
      double precision advf(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer ip1
      integer ip2
      integer j
      double precision phxfac
      double precision phyfac

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adaf(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adpf(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advf(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      ab15 = 1.5d0+epsab_cd
      ab05 = (-0.5d0)-epsab_cd
      if (staggertimestep) then
        phxfac = pffacmom
        phyfac = pffacmom
      else
        phxfac = 0.
        phyfac = 0.
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          advvel(i,j,k,bi,bj) = advvel(i,j,k,bi,bj)+advnm1(i,j,k,bi,bj)
          advnm1(i,j,k,bi,bj) = 0.d0
          aduvel(i,j,k,bi,bj) = aduvel(i,j,k,bi,bj)+adunm1(i,j,k,bi,bj)
          adunm1(i,j,k,bi,bj) = 0.d0
        end do
      end do
      do j = jmin, jmax
        do i = imin, imax
          aduveld(i,j,k,bi,bj) = aduveld(i,j,k,bi,bj)-0.5d0*adgvcor(i,j)
     $*(fcori(i,j,bi,bj)+fcori(i,j-1,bi,bj))*cffacmom
          adgvcor(i,j) = 0.d0
        end do
      end do
      do j = jmin, jmax
        do i = imin, imax
          adunm1(i+1,j-1,k,bi,bj) = adunm1(i+1,j-1,k,bi,bj)+0.25d0*
     $aduveld(i,j,k,bi,bj)*(1.d0-rcd)*ab05*masks(i,j,k,bi,bj)
          adunm1(i,j-1,k,bi,bj) = adunm1(i,j-1,k,bi,bj)+0.25d0*aduveld(
     $i,j,k,bi,bj)*(1.d0-rcd)*ab05*masks(i,j,k,bi,bj)
          adunm1(i+1,j,k,bi,bj) = adunm1(i+1,j,k,bi,bj)+0.25d0*aduveld(
     $i,j,k,bi,bj)*(1.d0-rcd)*ab05*masks(i,j,k,bi,bj)
          adunm1(i,j,k,bi,bj) = adunm1(i,j,k,bi,bj)+0.25d0*aduveld(i,j,
     $k,bi,bj)*(1.d0-rcd)*ab05*masks(i,j,k,bi,bj)
          aduvel(i+1,j-1,k,bi,bj) = aduvel(i+1,j-1,k,bi,bj)+0.25d0*
     $aduveld(i,j,k,bi,bj)*(1.d0-rcd)*ab15*masks(i,j,k,bi,bj)
          aduvel(i,j-1,k,bi,bj) = aduvel(i,j-1,k,bi,bj)+0.25d0*aduveld(
     $i,j,k,bi,bj)*(1.d0-rcd)*ab15*masks(i,j,k,bi,bj)
          aduvel(i+1,j,k,bi,bj) = aduvel(i+1,j,k,bi,bj)+0.25d0*aduveld(
     $i,j,k,bi,bj)*(1.d0-rcd)*ab15*masks(i,j,k,bi,bj)
          aduvel(i,j,k,bi,bj) = aduvel(i,j,k,bi,bj)+0.25d0*aduveld(i,j,
     $k,bi,bj)*(1.d0-rcd)*ab15*masks(i,j,k,bi,bj)
          aduveld(i,j,k,bi,bj) = aduveld(i,j,k,bi,bj)*rcd*masks(i,j,k,
     $bi,bj)
        end do
      end do
      do j = jmin, jmax
        do i = imin, imax
          advf(i,j) = advf(i,j)+aduveld(i,j,k,bi,bj)*deltatmom
        end do
      end do
      do j = jmin, jmax
        do i = imin, imax
          adaf(i+1,j-1) = adaf(i+1,j-1)+0.25d0*advf(i,j)*masks(i,j,k,bi,
     $bj)
          adaf(i,j-1) = adaf(i,j-1)+0.25d0*advf(i,j)*masks(i,j,k,bi,bj)
          adaf(i+1,j) = adaf(i+1,j)+0.25d0*advf(i,j)*masks(i,j,k,bi,bj)
          adaf(i,j) = adaf(i,j)+0.25d0*advf(i,j)*masks(i,j,k,bi,bj)
          advnm1(i,j,k,bi,bj) = advnm1(i,j,k,bi,bj)+0.5d0*advf(i,j)*(
     $fcori(i,j,bi,bj)+fcori(i,j-1,bi,bj))*ab05
          advvel(i,j,k,bi,bj) = advvel(i,j,k,bi,bj)+0.5d0*advf(i,j)*(
     $fcori(i,j,bi,bj)+fcori(i,j-1,bi,bj))*ab15
          advf(i,j) = 0.d0
        end do
      end do
      do j = 1-oly, sny+oly
        do i = 1-olx+1, snx+olx
          addphihydx(i,j) = addphihydx(i,j)-adaf(i,j)*phxfac*maskw(i,j,
     $k,bi,bj)
          adgufld(i,j) = adgufld(i,j)+adaf(i,j)*maskw(i,j,k,bi,bj)
          adpf(i-1,j) = adpf(i-1,j)+adaf(i,j)*recip_dxc(i,j,bi,bj)*
     $maskw(i,j,k,bi,bj)
          adpf(i,j) = adpf(i,j)-adaf(i,j)*recip_dxc(i,j,bi,bj)*maskw(i,
     $j,k,bi,bj)
          adaf(i,j) = 0.d0
        end do
      end do
      do j = jmin, jmax
        do i = imin, imax
          advveld(i,j,k,bi,bj) = advveld(i,j,k,bi,bj)+0.5d0*adgucor(i,j)
     $*(fcori(i,j,bi,bj)+fcori(i-1,j,bi,bj))*cffacmom
          adgucor(i,j) = 0.d0
        end do
      end do
      do j = jmin, jmax
        do i = imin, imax
          advnm1(i-1,j+1,k,bi,bj) = advnm1(i-1,j+1,k,bi,bj)+0.25d0*
     $advveld(i,j,k,bi,bj)*(1.d0-rcd)*ab05*maskw(i,j,k,bi,bj)
          advnm1(i,j+1,k,bi,bj) = advnm1(i,j+1,k,bi,bj)+0.25d0*advveld(
     $i,j,k,bi,bj)*(1.d0-rcd)*ab05*maskw(i,j,k,bi,bj)
          advnm1(i-1,j,k,bi,bj) = advnm1(i-1,j,k,bi,bj)+0.25d0*advveld(
     $i,j,k,bi,bj)*(1.d0-rcd)*ab05*maskw(i,j,k,bi,bj)
          advnm1(i,j,k,bi,bj) = advnm1(i,j,k,bi,bj)+0.25d0*advveld(i,j,
     $k,bi,bj)*(1.d0-rcd)*ab05*maskw(i,j,k,bi,bj)
          advvel(i-1,j+1,k,bi,bj) = advvel(i-1,j+1,k,bi,bj)+0.25d0*
     $advveld(i,j,k,bi,bj)*(1.d0-rcd)*ab15*maskw(i,j,k,bi,bj)
          advvel(i,j+1,k,bi,bj) = advvel(i,j+1,k,bi,bj)+0.25d0*advveld(
     $i,j,k,bi,bj)*(1.d0-rcd)*ab15*maskw(i,j,k,bi,bj)
          advvel(i-1,j,k,bi,bj) = advvel(i-1,j,k,bi,bj)+0.25d0*advveld(
     $i,j,k,bi,bj)*(1.d0-rcd)*ab15*maskw(i,j,k,bi,bj)
          advvel(i,j,k,bi,bj) = advvel(i,j,k,bi,bj)+0.25d0*advveld(i,j,
     $k,bi,bj)*(1.d0-rcd)*ab15*maskw(i,j,k,bi,bj)
          advveld(i,j,k,bi,bj) = advveld(i,j,k,bi,bj)*rcd*maskw(i,j,k,
     $bi,bj)
        end do
      end do
      do j = jmin, jmax
        do i = imin, imax
          advf(i,j) = advf(i,j)+advveld(i,j,k,bi,bj)*deltatmom
        end do
      end do
      do j = jmin, jmax
        do i = imin, imax
          adaf(i-1,j+1) = adaf(i-1,j+1)+0.25d0*advf(i,j)*maskw(i,j,k,bi,
     $bj)
          adaf(i,j+1) = adaf(i,j+1)+0.25d0*advf(i,j)*maskw(i,j,k,bi,bj)
          adaf(i-1,j) = adaf(i-1,j)+0.25d0*advf(i,j)*maskw(i,j,k,bi,bj)
          adaf(i,j) = adaf(i,j)+0.25d0*advf(i,j)*maskw(i,j,k,bi,bj)
          adunm1(i,j,k,bi,bj) = adunm1(i,j,k,bi,bj)-0.5d0*advf(i,j)*(
     $fcori(i,j,bi,bj)+fcori(i-1,j,bi,bj))*ab05
          aduvel(i,j,k,bi,bj) = aduvel(i,j,k,bi,bj)-0.5d0*advf(i,j)*(
     $fcori(i,j,bi,bj)+fcori(i-1,j,bi,bj))*ab15
          advf(i,j) = 0.d0
        end do
      end do
      do j = 1-oly+1, sny+oly
        do i = 1-olx, snx+olx
          addphihydy(i,j) = addphihydy(i,j)-adaf(i,j)*phyfac*masks(i,j,
     $k,bi,bj)
          adgvfld(i,j) = adgvfld(i,j)+adaf(i,j)*masks(i,j,k,bi,bj)
          adpf(i,j-1) = adpf(i,j-1)+adaf(i,j)*recip_dyc(i,j,bi,bj)*
     $masks(i,j,k,bi,bj)
          adpf(i,j) = adpf(i,j)-adaf(i,j)*recip_dyc(i,j,bi,bj)*masks(i,
     $j,k,bi,bj)
          adaf(i,j) = 0.d0
        end do
      end do
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          adetan(i,j,bi,bj) = adetan(i,j,bi,bj)+adpf(i,j)*bo_surf(i,j,
     $bi,bj)*ab15
          adetanm1(i,j,bi,bj) = adetanm1(i,j,bi,bj)+adpf(i,j)*bo_surf(i,
     $j,bi,bj)*ab05
          adpf(i,j) = 0.d0
        end do
      end do

      end

      subroutine adconvective_adjustment( bi, bj, mytime, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      real*8 comlev1_bibj_k_rhok_50h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadrhok/ comlev1_bibj_k_rhok_50h

      real*8 comlev1_bibj_k_rhokm1_49h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadrhokm1/ comlev1_bibj_k_rhokm1_49h

      real*8 comlev1_bibj_k_salt_48h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadsalt/ comlev1_bibj_k_salt_48h

      real*8 comlev1_bibj_k_salt_45h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadsalu/ comlev1_bibj_k_salt_45h

      real*8 comlev1_bibj_k_theta_47h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadthetb/ comlev1_bibj_k_theta_47h

      real*8 comlev1_bibj_k_theta_44h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadthetc/ comlev1_bibj_k_theta_44h

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

      integer ikey
      integer key
      common /tamckeys/ key, ikey

C==============================================
C declare arguments
C==============================================
      integer bi
      integer bj
      integer mythid
      double precision mytime

C==============================================
C declare local variables
C==============================================
      integer act1
      integer act2
      integer act3
      integer act4
      double precision adrhok(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrhokm1(1-olx:snx+olx,1-oly:sny+oly)
      double precision convectcount(1-olx:snx+olx,1-oly:sny+oly,nr)
      integer deltak
      integer help_h
      integer help_j
      logical help_k
      integer imax
      integer imin
      integer ip1
      integer ip2
      integer jmax
      integer jmin
      integer k
      integer kbottom
      integer kdir
      integer kkey
      integer ktop
      integer max1
      integer max2
      integer max3
      double precision rhok(1-olx:snx+olx,1-oly:sny+oly)
      double precision rhokm1(1-olx:snx+olx,1-oly:sny+oly)
      double precision weighta(1-olx:snx+olx,1-oly:sny+oly)
      double precision weightb(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare external procedures and functions
C==============================================
      logical different_multiple
      external different_multiple

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adrhok(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adrhokm1(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      help_k = different_multiple(cadjfreq,mytime,deltatclock)
      if (help_k) then
        imin = 1-olx
        imax = snx+olx
        jmin = 1-oly
        jmax = sny+oly
        act1 = bi-mybxlo(mythid)
        max1 = mybxhi(mythid)-mybxlo(mythid)+1
        act2 = bj-mybylo(mythid)
        max2 = mybyhi(mythid)-mybylo(mythid)+1
        act3 = mythid-1
        max3 = ntx*nty
        act4 = ikey_dynamics-1
        ikey = act1+1+act2*max1+act3*max1*max2+act4*max1*max2*max3
        if (rksign*gravitysign .gt. 0.) then
          ktop = 2
          kbottom = nr
          kdir = 1
          deltak = -1
        else
          ktop = nr
          kbottom = 2
          kdir = -1
          deltak = 0
        endif
        do k = ktop+kdir*(int((kbottom-ktop+kdir)/kdir)-1), ktop, -kdir
          kkey = (ikey-1)*nr+k
          help_h = k+deltak
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              theta(ip1,ip2,k,bi,bj) = comlev1_bibj_k_theta_47h(ip1,ip2,
     $kkey)
            end do
          end do
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              salt(ip1,ip2,k,bi,bj) = comlev1_bibj_k_salt_48h(ip1,ip2,
     $kkey)
            end do
          end do
          help_j = k+deltak
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              rhokm1(ip1,ip2) = comlev1_bibj_k_rhokm1_49h(ip1,ip2,kkey)
            end do
          end do
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              rhok(ip1,ip2) = comlev1_bibj_k_rhok_50h(ip1,ip2,kkey)
            end do
          end do
          call convective_weights( bi,bj,k,rhokm1,rhok,weighta,weightb,
     $convectcount,mythid )
          call adconvectively_mixtracer( bi,bj,k,weighta,weightb,adsalt 
     $)
          call adconvectively_mixtracer( bi,bj,k,weighta,weightb,
     $adtheta )
          call adfind_rho_2d( imin,imax,jmin,jmax,help_j,theta(1-olx,1-
     $oly,k,bi,bj),adtheta(1-olx,1-oly,k,bi,bj),salt(1-olx,1-oly,k,bi,
     $bj),adsalt(1-olx,1-oly,k,bi,bj),adrhok,bi,bj )
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              theta(ip1,ip2,k-1,bi,bj) = comlev1_bibj_k_theta_44h(ip1,
     $ip2,kkey)
            end do
          end do
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              salt(ip1,ip2,k-1,bi,bj) = comlev1_bibj_k_salt_45h(ip1,ip2,
     $kkey)
            end do
          end do
          call adfind_rho_2d( imin,imax,jmin,jmax,help_h,theta(1-olx,1-
     $oly,k-1,bi,bj),adtheta(1-olx,1-oly,k-1,bi,bj),salt(1-olx,1-oly,k-
     $1,bi,bj),adsalt(1-olx,1-oly,k-1,bi,bj),adrhokm1,bi,bj )
        end do
      endif

      end

      subroutine mdconvective_adjustment( bi, bj, mytime, myiter, 
     $mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      real*8 comlev1_bibj_k_convectcount_46h(1-olx:snx+olx,1-oly:sny+
     $oly,1800)
      common /cadconvectcount/ comlev1_bibj_k_convectcount_46h

      real*8 comlev1_bibj_convectcount_3h(1-olx:snx+olx,1-oly:sny+oly,
     $nr,120)
      common /cadconvectcounu/ comlev1_bibj_convectcount_3h

      real*8 comlev1_bibj_k_rhok_50h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadrhok/ comlev1_bibj_k_rhok_50h

      real*8 comlev1_bibj_k_rhokm1_49h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadrhokm1/ comlev1_bibj_k_rhokm1_49h

      real*8 comlev1_bibj_k_salt_48h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadsalt/ comlev1_bibj_k_salt_48h

      real*8 comlev1_bibj_k_salt_45h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadsalu/ comlev1_bibj_k_salt_45h

      real*8 comlev1_bibj_salt_2h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadsalv/ comlev1_bibj_salt_2h

      real*8 comlev1_bibj_k_theta_47h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadthetb/ comlev1_bibj_k_theta_47h

      real*8 comlev1_bibj_k_theta_44h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadthetc/ comlev1_bibj_k_theta_44h

      real*8 comlev1_bibj_theta_1h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadthetd/ comlev1_bibj_theta_1h

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

      integer ikey
      integer key
      common /tamckeys/ key, ikey

C==============================================
C declare arguments
C==============================================
      integer bi
      integer bj
      integer myiter
      integer mythid
      double precision mytime

C==============================================
C declare local variables
C==============================================
      integer act1
      integer act2
      integer act3
      integer act4
      double precision convectcount(1-olx:snx+olx,1-oly:sny+oly,nr)
      integer deltak
      integer help_h
      integer help_i
      integer help_j
      logical help_k
      integer i
      integer imax
      integer imin
      integer iq0
      integer iq1
      integer iq2
      integer iq3
      integer iq4
      integer iq5
      integer iq6
      integer iq7
      integer iq8
      integer iq9
      integer iqo
      integer iqp
      integer iqq
      integer iqr
      integer iqs
      integer iqt
      integer iqu
      integer iqv
      integer iqw
      integer iqx
      integer iqy
      integer iqz
      integer ira
      integer j
      integer jmax
      integer jmin
      integer k
      integer kbottom
      integer kdir
      integer kkey
      integer ktop
      integer max1
      integer max2
      integer max3
      double precision rhok(1-olx:snx+olx,1-oly:sny+oly)
      double precision rhokm1(1-olx:snx+olx,1-oly:sny+oly)
      double precision weighta(1-olx:snx+olx,1-oly:sny+oly)
      double precision weightb(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare external procedures and functions
C==============================================
      logical different_multiple
      external different_multiple

C**********************************************
C executable statements of routine
C**********************************************
      help_k = different_multiple(cadjfreq,mytime,deltatclock)
      if (help_k) then
        imin = 1-olx
        imax = snx+olx
        jmin = 1-oly
        jmax = sny+oly
        do k = 1, nr
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              convectcount(i,j,k) = 0.
            end do
          end do
        end do
        act1 = bi-mybxlo(mythid)
        max1 = mybxhi(mythid)-mybxlo(mythid)+1
        act2 = bj-mybylo(mythid)
        max2 = mybyhi(mythid)-mybylo(mythid)+1
        act3 = mythid-1
        max3 = ntx*nty
        act4 = ikey_dynamics-1
        ikey = act1+1+act2*max1+act3*max1*max2+act4*max1*max2*max3
        if (rksign*gravitysign .gt. 0.) then
          ktop = 2
          kbottom = nr
          kdir = 1
          deltak = -1
        else
          ktop = nr
          kbottom = 2
          kdir = -1
          deltak = 0
        endif
        do ira = 1, nr
          do iq9 = 1-oly, sny+oly
            do iq8 = 1-olx, snx+olx
              comlev1_bibj_theta_1h(iq8,iq9,ira,ikey) = theta(iq8,iq9,
     $ira,bi,bj)
            end do
          end do
        end do
        do iq7 = 1, nr
          do iq6 = 1-oly, sny+oly
            do iq5 = 1-olx, snx+olx
              comlev1_bibj_salt_2h(iq5,iq6,iq7,ikey) = salt(iq5,iq6,iq7,
     $bi,bj)
            end do
          end do
        end do
        do iq4 = 1, nr
          do iq3 = 1-oly, sny+oly
            do iq2 = 1-olx, snx+olx
              comlev1_bibj_convectcount_3h(iq2,iq3,iq4,ikey) = 
     $convectcount(iq2,iq3,iq4)
            end do
          end do
        end do
        do k = ktop, kbottom, kdir
          kkey = (ikey-1)*nr+k
          do iq1 = 1-oly, sny+oly
            do iq0 = 1-olx, snx+olx
              comlev1_bibj_k_theta_44h(iq0,iq1,kkey) = theta(iq0,iq1,k-
     $1,bi,bj)
            end do
          end do
          do iqz = 1-oly, sny+oly
            do iqy = 1-olx, snx+olx
              comlev1_bibj_k_salt_45h(iqy,iqz,kkey) = salt(iqy,iqz,k-1,
     $bi,bj)
            end do
          end do
          do iqx = 1-oly, sny+oly
            do iqw = 1-olx, snx+olx
              comlev1_bibj_k_convectcount_46h(iqw,iqx,kkey) = 
     $convectcount(iqw,iqx,k-1)
            end do
          end do
          help_h = k+deltak
          call find_rho_2d( imin,imax,jmin,jmax,help_h,theta(1-olx,1-
     $oly,k-1,bi,bj),salt(1-olx,1-oly,k-1,bi,bj),rhokm1,help_i,bi,bj,
     $mythid )
          do iqv = 1-oly, sny+oly
            do iqu = 1-olx, snx+olx
              comlev1_bibj_k_theta_47h(iqu,iqv,kkey) = theta(iqu,iqv,k,
     $bi,bj)
            end do
          end do
          do iqt = 1-oly, sny+oly
            do iqs = 1-olx, snx+olx
              comlev1_bibj_k_salt_48h(iqs,iqt,kkey) = salt(iqs,iqt,k,bi,
     $bj)
            end do
          end do
          help_j = k+deltak
          call find_rho_2d( imin,imax,jmin,jmax,help_j,theta(1-olx,1-
     $oly,k,bi,bj),salt(1-olx,1-oly,k,bi,bj),rhok,k,bi,bj,mythid )
          do iqr = 1-oly, sny+oly
            do iqq = 1-olx, snx+olx
              comlev1_bibj_k_rhokm1_49h(iqq,iqr,kkey) = rhokm1(iqq,iqr)
            end do
          end do
          do iqp = 1-oly, sny+oly
            do iqo = 1-olx, snx+olx
              comlev1_bibj_k_rhok_50h(iqo,iqp,kkey) = rhok(iqo,iqp)
            end do
          end do
          call convective_weights( bi,bj,k,rhokm1,rhok,weighta,weightb,
     $convectcount,mythid )
          call convectively_mixtracer( bi,bj,k,weighta,weightb,theta,
     $mythid )
          call convectively_mixtracer( bi,bj,k,weighta,weightb,salt,
     $mythid )
        end do
      endif
      end

      subroutine adconvectively_mixtracer( bi, bj, k, weighta, weightb, 
     $adtracer )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
C==============================================
C declare arguments
C==============================================
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer k
      double precision weighta(1-olx:snx+olx,1-oly:sny+oly)
      double precision weightb(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision addeltrac
      integer i
      integer j

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      addeltrac = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = sny+oly, 1-oly, -1
        addeltrac = 0.d0
        do i = snx+olx, 1-olx, -1
          addeltrac = 0.d0
          addeltrac = addeltrac-adtracer(i,j,k,bi,bj)*weightb(i,j)
          addeltrac = addeltrac+adtracer(i,j,k-1,bi,bj)*weighta(i,j)
          adtracer(i,j,k-1,bi,bj) = adtracer(i,j,k-1,bi,bj)-addeltrac
          adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+addeltrac
          addeltrac = 0.d0
        end do
      end do

      end

      subroutine adcorrection_step( bi, bj, imin, imax, jmin, jmax, k, 
     $adphisurfx, adphisurfy )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adphisurfx(1-olx:snx+olx,1-oly:sny+oly)
      double precision adphisurfy(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      double precision psfac

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      psfac = pffacmom*implicsurfpress*recip_deepfacc(k)*recip_rhofacc(
     $k)
      do j = jmin, jmax
        do i = imin, imax
          adgv(i,j,k,bi,bj) = adgv(i,j,k,bi,bj)+advvel(i,j,k,bi,bj)*
     $masks(i,j,k,bi,bj)
          adphisurfy(i,j) = adphisurfy(i,j)-advvel(i,j,k,bi,bj)*
     $deltatmom*psfac*masks(i,j,k,bi,bj)
          advvel(i,j,k,bi,bj) = 0.d0
        end do
      end do
      do j = jmin, jmax
        do i = imin, imax
          adgu(i,j,k,bi,bj) = adgu(i,j,k,bi,bj)+aduvel(i,j,k,bi,bj)*
     $maskw(i,j,k,bi,bj)
          adphisurfx(i,j) = adphisurfx(i,j)-aduvel(i,j,k,bi,bj)*
     $deltatmom*psfac*maskw(i,j,k,bi,bj)
          aduvel(i,j,k,bi,bj) = 0.d0
        end do
      end do

      end

      subroutine adcost_accumulate_mean( mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adcmeantheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      common /adcost_mean_r/ adcmeantheta

      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision lastinterval
      common /cost_param_r/ lastinterval

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      integer mythid

C==============================================
C declare local variables
C==============================================
      integer bi
      integer bj
      integer i
      integer ithi
      integer itlo
      integer j
      integer jthi
      integer jtlo
      integer k

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      jtlo = mybylo(mythid)
      jthi = mybyhi(mythid)
      itlo = mybxlo(mythid)
      ithi = mybxhi(mythid)
      do bj = jtlo, jthi
        do bi = itlo, ithi
          do k = 1, nr
            do j = 1, sny
              do i = 1, snx
                adtheta(i,j,k,bi,bj) = adtheta(i,j,k,bi,bj)+
     $adcmeantheta(i,j,k,bi,bj)/lastinterval*deltatclock
              end do
            end do
          end do
        end do
      end do

      end

      subroutine adcost_final( mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adobjf_hflux_tut(nsx,nsy)
      double precision adobjf_temp_tut(nsx,nsy)
      common /adcost_objf/ adobjf_hflux_tut, adobjf_temp_tut

      double precision adfc
      common /adcost_r/ adfc

      double precision mult_atl
      double precision mult_eflux
      double precision mult_entropy
      double precision mult_hflux_tut
      double precision mult_t_misfit
      double precision mult_temp_tut
      double precision mult_test
      double precision mult_tracer
      double precision multetan
      double precision multsalt
      double precision multtheta
      double precision multuvel
      double precision multvvel
      common /cost_aux_r/ mult_atl, mult_test, mult_tracer, 
     $mult_entropy, mult_t_misfit, mult_eflux, multtheta, multsalt, 
     $multuvel, multvvel, multetan, mult_hflux_tut, mult_temp_tut

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

C==============================================
C declare arguments
C==============================================
      integer mythid

C==============================================
C declare local variables
C==============================================
      integer bi
      integer bj
      integer ithi
      integer itlo
      integer jthi
      integer jtlo

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      jtlo = mybylo(mythid)
      jthi = mybyhi(mythid)
      itlo = mybxlo(mythid)
      ithi = mybxhi(mythid)
      call global_adsum_r8( adfc,mythid )
      do bj = jtlo, jthi
        do bi = itlo, ithi
          adobjf_hflux_tut(bi,bj) = adobjf_hflux_tut(bi,bj)+adfc*
     $mult_hflux_tut
          adobjf_temp_tut(bi,bj) = adobjf_temp_tut(bi,bj)+adfc*
     $mult_temp_tut
        end do
      end do
      call adcost_temp( mythid )
      call adcost_hflux( mythid )

      end

      subroutine adcost_hflux( mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adobjf_hflux_tut(nsx,nsy)
      double precision adobjf_temp_tut(nsx,nsy)
      common /adcost_objf/ adobjf_hflux_tut, adobjf_temp_tut

      double precision adqnetm(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /admean_qnet/ adqnetm

      double precision whfluxm(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /cost_weights_r/ whfluxm

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision qnetm(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /mean_qnet/ qnetm

C==============================================
C declare arguments
C==============================================
      integer mythid

C==============================================
C declare local variables
C==============================================
      double precision adlocfc
      integer bi
      integer bj
      integer i
      integer j
      double precision tmpc

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adlocfc = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      tmpc = 0.d0
      do bj = mybylo(mythid), mybyhi(mythid)
        do bi = mybxlo(mythid), mybxhi(mythid)
          do j = 1, sny
            do i = 1, snx
              tmpc = tmpc+maskc(i,j,1,bi,bj)
            end do
          end do
        end do
      end do
      call global_sum_r8( tmpc,mythid )
      if (tmpc .gt. 0.) then
        tmpc = 1.d0/tmpc
      endif
      do bj = mybyhi(mythid), mybylo(mythid), -1
        adlocfc = 0.d0
        do bi = mybxhi(mythid), mybxlo(mythid), -1
          adlocfc = 0.d0
          adlocfc = adlocfc+adobjf_hflux_tut(bi,bj)
          adobjf_hflux_tut(bi,bj) = 0.d0
          do j = 1, sny
            do i = 1, snx
              adqnetm(i,j,bi,bj) = adqnetm(i,j,bi,bj)+2*adlocfc*tmpc*
     $maskc(i,j,1,bi,bj)*whfluxm(i,j,bi,bj)*qnetm(i,j,bi,bj)
            end do
          end do
          adlocfc = 0.d0
        end do
      end do

      end

      subroutine adcost_init_varia
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adcmeantheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      common /adcost_mean_r/ adcmeantheta

      double precision adfc
      common /adcost_r/ adfc

C==============================================
C declare local variables
C==============================================
      integer ip1
      integer ip2
      integer ip3
      integer ip4
      integer ip5

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adcmeantheta(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      adfc = 0.d0

      end

      subroutine adcost_temp( mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adcmeantheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      common /adcost_mean_r/ adcmeantheta

      double precision adobjf_hflux_tut(nsx,nsy)
      double precision adobjf_temp_tut(nsx,nsy)
      common /adcost_objf/ adobjf_hflux_tut, adobjf_temp_tut

      double precision cmeantheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision cmeanthetauvel(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy)
      double precision cmeanthetavvel(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy)
      double precision cmeanuvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision cmeanvvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /cost_mean_r/ cmeantheta, cmeanuvel, cmeanvvel, 
     $cmeanthetauvel, cmeanthetavvel

      double precision wdiffkr(nr,nsx,nsy)
      double precision wedtaux(nr,nsx,nsy)
      double precision wedtauy(nr,nsx,nsy)
      double precision wetan(snx,sny,nsx,nsy)
      double precision wkapgm(nr,nsx,nsy)
      double precision wkapredi(nr,nsx,nsy)
      double precision wsalt(nr,nsx,nsy)
      double precision wtheta(nr,nsx,nsy)
      double precision wuvvel(nr,nsx,nsy)
      common /ctrl_weights_dummy_r/ wtheta, wsalt, wuvvel, wetan, 
     $wdiffkr, wkapgm, wkapredi, wedtaux, wedtauy

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      integer mythid

C==============================================
C declare local variables
C==============================================
      double precision adlocfc
      integer bi
      integer bj
      integer i
      integer j
      integer k
      integer nk
      double precision thetalev(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision tmp

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adlocfc = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      nk = 2
      call read_fld_xyz_rl( 'lev_t_an.bin',' ',thetalev,0,mythid )
      tmp = 0.d0
      do bj = mybylo(mythid), mybyhi(mythid)
        do bi = mybxlo(mythid), mybxhi(mythid)
          do k = 1, nk
            do j = 1, sny
              do i = 1, snx
                tmp = tmp+maskc(i,j,k,bi,bj)
              end do
            end do
          end do
        end do
      end do
      call global_sum_r8( tmp,mythid )
      if (tmp .gt. 0.) then
        tmp = 1.d0/tmp
      endif
      do bj = mybyhi(mythid), mybylo(mythid), -1
        adlocfc = 0.d0
        do bi = mybxhi(mythid), mybxlo(mythid), -1
          adlocfc = 0.d0
          adlocfc = adlocfc+adobjf_temp_tut(bi,bj)
          adobjf_temp_tut(bi,bj) = 0.d0
          do k = 1, nk
            do j = 1, sny
              do i = 1, snx
                adcmeantheta(i,j,k,bi,bj) = adcmeantheta(i,j,k,bi,bj)+2*
     $adlocfc*tmp*maskc(i,j,k,bi,bj)*wtheta(k,bi,bj)*(cmeantheta(i,j,k,
     $bi,bj)-thetalev(i,j,k,bi,bj))
              end do
            end do
          end do
          adlocfc = 0.d0
        end do
      end do

      end

      subroutine adcost_tile( mytime, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )

C==============================================
C declare common blocks
C==============================================
      double precision lastinterval
      common /cost_param_r/ lastinterval

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      integer mythid
      double precision mytime

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (mytime .gt. endtime-lastinterval) then
        call adcost_accumulate_mean( mythid )
      endif

      end

      subroutine mdcost_tile( mytime, myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      real*8 comlev1_theta_1h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /cadtheta/ comlev1_theta_1h

      real*8 comlev1_uvel_2h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /caduvel/ comlev1_uvel_2h

      real*8 comlev1_vvel_3h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /cadvvel/ comlev1_vvel_3h

      double precision lastinterval
      common /cost_param_r/ lastinterval

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      integer myiter
      integer mythid
      double precision mytime

C==============================================
C declare local variables
C==============================================
      integer iqa
      integer iqb
      integer iqc
      integer iqd
      integer iqe
      integer iqf
      integer iqg
      integer iqh
      integer iqi
      integer iqj

C**********************************************
C executable statements of routine
C**********************************************
      do iqj = 1, nsy
        do iqi = 1, nsx
          do iqh = 1, nr
            do iqg = 1-oly, sny+oly
              do iqf = 1-olx, snx+olx
                comlev1_theta_1h(iqf,iqg,iqh,iqi,iqj,ikey_dynamics) = 
     $theta(iqf,iqg,iqh,iqi,iqj)
              end do
            end do
          end do
        end do
      end do
      do iqe = 1, nsy
        do iqd = 1, nsx
          do iqc = 1, nr
            do iqb = 1-oly, sny+oly
              do iqa = 1-olx, snx+olx
                comlev1_uvel_2h(iqa,iqb,iqc,iqd,iqe,ikey_dynamics) = 
     $uvel(iqa,iqb,iqc,iqd,iqe)
              end do
            end do
          end do
        end do
      end do
      do iqe = 1, nsy
        do iqd = 1, nsx
          do iqc = 1, nr
            do iqb = 1-oly, sny+oly
              do iqa = 1-olx, snx+olx
                comlev1_vvel_3h(iqa,iqb,iqc,iqd,iqe,ikey_dynamics) = 
     $vvel(iqa,iqb,iqc,iqd,iqe)
              end do
            end do
          end do
        end do
      end do
      if (mytime .gt. endtime-lastinterval) then
        call cost_accumulate_mean( mythid )
      endif
      end

      subroutine adctrl_map_forcing( mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_len_fnam
      parameter ( max_len_fnam = 512 )
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adtmpfld2d(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adcontrolvars_r/ adtmpfld2d

      double precision adqnetm(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /admean_qnet/ adqnetm

      character*(max_len_fnam) xx_apressure_file
      character*(max_len_fnam) xx_aqh_file
      character*(max_len_fnam) xx_atemp_file
      character*(max_len_fnam) xx_bottomdrag_file
      character*(max_len_fnam) xx_depth_file
      character*(max_len_fnam) xx_diffkr_file
      character*(max_len_fnam) xx_edtaux_file
      character*(max_len_fnam) xx_edtauy_file
      character*(max_len_fnam) xx_efluxp_file
      character*(max_len_fnam) xx_efluxy_file
      character*(max_len_fnam) xx_etan_file
      character*(max_len_fnam) xx_evap_file
      character*(max_len_fnam) xx_gen2d_file
      character*(max_len_fnam) xx_gen3d_file
      character*(max_len_fnam) xx_hflux_file
      character*(max_len_fnam) xx_hfluxm_file
      character*(max_len_fnam) xx_kapgm_file
      character*(max_len_fnam) xx_kapredi_file
      character*(max_len_fnam) xx_lwdown_file
      character*(max_len_fnam) xx_lwflux_file
      character*(max_len_fnam) xx_obcse_file
      character*(max_len_fnam) xx_obcsn_file
      character*(max_len_fnam) xx_obcss_file
      character*(max_len_fnam) xx_obcsw_file
      character*(max_len_fnam) xx_precip_file
      character*(max_len_fnam) xx_relaxsss_file
      character*(max_len_fnam) xx_relaxsst_file
      character*(max_len_fnam) xx_runoff_file
      character*(max_len_fnam) xx_salt_file
      character*(max_len_fnam) xx_salt_ini_fin_file
      character*(max_len_fnam) xx_sflux_file
      character*(max_len_fnam) xx_siarea_file
      character*(max_len_fnam) xx_siheff_file
      character*(max_len_fnam) xx_sihsnow_file
      character*(max_len_fnam) xx_snowprecip_file
      character*(max_len_fnam) xx_sss_file
      character*(max_len_fnam) xx_sst_file
      character*(max_len_fnam) xx_swdown_file
      character*(max_len_fnam) xx_swflux_file
      character*(max_len_fnam) xx_tauu_file
      character*(max_len_fnam) xx_tauv_file
      character*(max_len_fnam) xx_theta_file
      character*(max_len_fnam) xx_theta_ini_fin_file
      character*(max_len_fnam) xx_tr1_file
      character*(max_len_fnam) xx_uvel_file
      character*(max_len_fnam) xx_uwind_file
      character*(max_len_fnam) xx_vvel_file
      character*(max_len_fnam) xx_vwind_file
      common /controlfiles_c/ xx_theta_file, xx_salt_file, 
     $xx_hflux_file, xx_sflux_file, xx_tauu_file, xx_tauv_file, 
     $xx_atemp_file, xx_aqh_file, xx_precip_file, xx_swflux_file, 
     $xx_swdown_file, xx_lwflux_file, xx_lwdown_file, xx_evap_file, 
     $xx_snowprecip_file, xx_apressure_file, xx_runoff_file, 
     $xx_uwind_file, xx_vwind_file, xx_obcsn_file, xx_obcss_file, 
     $xx_obcsw_file, xx_obcse_file, xx_diffkr_file, xx_kapgm_file, 
     $xx_kapredi_file, xx_tr1_file, xx_sst_file, xx_sss_file, 
     $xx_depth_file, xx_efluxy_file, xx_efluxp_file, xx_bottomdrag_file,
     $ xx_edtaux_file, xx_edtauy_file, xx_uvel_file, xx_vvel_file, 
     $xx_etan_file, xx_relaxsst_file, xx_relaxsss_file, 
     $xx_theta_ini_fin_file, xx_salt_ini_fin_file, xx_siarea_file, 
     $xx_siheff_file, xx_sihsnow_file, xx_gen2d_file, xx_gen3d_file, 
     $xx_hfluxm_file

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      integer iprint
      integer nfunc
      integer numiter
      integer nupdate
      integer nvars
      integer optimcycle
      common /optiparm_i/ optimcycle, nvars, numiter, nfunc, iprint, 
     $nupdate

C==============================================
C declare arguments
C==============================================
      integer mythid

C==============================================
C declare local variables
C==============================================
      integer bi
      integer bj
      logical doglobalread
      character*(80) fnamehfluxm
      integer i
      integer il
      integer imax
      integer imin
      integer ithi
      integer itlo
      integer j
      integer jmax
      integer jmin
      integer jthi
      integer jtlo
      logical ladinit

C==============================================
C declare external procedures and functions
C==============================================
      integer ilnblnk
      external ilnblnk

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      jtlo = mybylo(mythid)
      jthi = mybyhi(mythid)
      itlo = mybxlo(mythid)
      ithi = mybxhi(mythid)
      jmin = 1
      jmax = sny
      imin = 1
      imax = snx
      doglobalread =  .false. 
      ladinit =  .false. 
      il = ilnblnk(xx_hfluxm_file)
      write(unit=fnamehfluxm(1:80),fmt='(2a,i10.10)') xx_hfluxm_file(1:
     $il),'.',optimcycle
      call adexch_xy_rs( adqnetm,mythid )
      do bj = jtlo, jthi
        do bi = itlo, ithi
          do j = jmin, jmax
            do i = imin, imax
              adtmpfld2d(i,j,bi,bj) = adtmpfld2d(i,j,bi,bj)+adqnetm(i,j,
     $bi,bj)
            end do
          end do
        end do
      end do
      call adactive_read_xy( fnamehfluxm,adtmpfld2d,1,doglobalread,
     $ladinit,optimcycle,mythid )

      end

      subroutine adcycle_tracer( bi, bj, adtracer, adgtracer )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
C==============================================
C declare arguments
C==============================================
      double precision adgtracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      integer k

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do k = 1, nr
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adgtracer(i,j,k,bi,bj) = adgtracer(i,j,k,bi,bj)+adtracer(i,
     $j,k,bi,bj)
            adtracer(i,j,k,bi,bj) = 0.d0
          end do
        end do
      end do

      end

      subroutine addiags_phi_hyd( k, bi, bj, imin, imax, jmin, jmax, 
     $adphihydc )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adrhoinsitu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision adtotphihyd(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      common /addynvars_diag/ adtotphihyd, adrhoinsitu

      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision bo_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision phi0surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_bo(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision topoz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /surf_fixed/ bo_surf, recip_bo, topoz, phi0surf

C==============================================
C declare arguments
C==============================================
      double precision adphihydc(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = jmin, jmax
        do i = imin, imax
          adetan(i,j,bi,bj) = adetan(i,j,bi,bj)+adtotphihyd(i,j,k,bi,bj)
     $*bo_surf(i,j,bi,bj)
          adphihydc(i,j) = adphihydc(i,j)+adtotphihyd(i,j,k,bi,bj)
          adtotphihyd(i,j,k,bi,bj) = 0.d0
        end do
      end do

      end

      subroutine addo_fields_blocking_exchanges( mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adetanm1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduveld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advveld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_cd/ aduveld, advveld, adetanm1, adunm1, advnm1

      double precision adrhoinsitu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision adtotphihyd(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      common /addynvars_diag/ adtotphihyd, adrhoinsitu

      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

C==============================================
C declare arguments
C==============================================
      integer mythid

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if ( .not. useoffline) then
        if (usedynp_ineos_zc) then
          call adexch_xyz_rl( adtotphihyd,mythid )
        endif
        call adexch_uv_dgrid_3d_rl( aduveld,advveld, .true. ,nr,mythid )
        if ( .not. implicitintgravwave) then
          call adexch_xyz_rl( adsalt,mythid )
          call adexch_xyz_rl( adtheta,mythid )
        endif
        if (( .not. staggertimestep) .or. ( .not. usemultidimadvec)) 
     $then
          if ( .not. implicitintgravwave) then
            call adexch_xyz_rl( adwvel,mythid )
          endif
          call adexch_uv_xyz_rl( aduvel,advvel, .true. ,mythid )
        endif
      endif

      end

      subroutine addo_oceanic_phys( mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adrhoinsitu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision adtotphihyd(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      common /addynvars_diag/ adtotphihyd, adrhoinsitu

      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision adkux(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adkvy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /adgm_hortensor/ adkux, adkvy

      double precision adkuz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adkvz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /adgm_uvtensor/ adkuz, adkvz

      real*8 comlev1_bibj_empmr_8h(1-olx:snx+olx,1-oly:sny+oly,120)
      common /cadempms/ comlev1_bibj_empmr_8h

      real*8 comlev1_bibj_pmepr_9h(1-olx:snx+olx,1-oly:sny+oly,120)
      common /cadpmepr/ comlev1_bibj_pmepr_9h

      real*8 comlev1_bibj_k_salt_52h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadsal0/ comlev1_bibj_k_salt_52h

      real*8 comlev1_bibj_salt_5h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadsal1/ comlev1_bibj_salt_5h

      real*8 comlev1_bibj_k_salt_54h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadsalz/ comlev1_bibj_k_salt_54h

      real*8 comlev1_bibj_k_theta_53h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadtheth/ comlev1_bibj_k_theta_53h

      real*8 comlev1_bibj_k_theta_51h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadtheti/ comlev1_bibj_k_theta_51h

      real*8 comlev1_bibj_theta_4h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadthetj/ comlev1_bibj_theta_4h

      real*8 comlev1_theta_7h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /cadthetk/ comlev1_theta_7h

      real*8 comlev1_bibj_totphihyd_6h(1-olx:snx+olx,1-oly:sny+oly,nr,
     $120)
      common /cadtotphihyf/ comlev1_bibj_totphihyd_6h

      double precision hmixlayer(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ivdconvcount(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision phihydlow(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rhoinsitu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision totphihyd(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_diag/ phihydlow, totphihyd, rhoinsitu, hmixlayer, 
     $ivdconvcount

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision detahdt(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision etahnm1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision pmepr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /exact_eta_local/ etahnm1, detahdt, pmepr

      double precision empmr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ffields_empmr/ empmr

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      integer mythid

C==============================================
C declare local variables
C==============================================
      integer act1
      integer act2
      integer act3
      integer act4
      double precision adrhokm1(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrhokp1(1-olx:snx+olx,1-oly:sny+oly)
      double precision adsigmar(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adsigmax(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adsigmay(1-olx:snx+olx,1-oly:sny+oly,nr)
      integer bi
      integer bj
      integer dodiagsrho
      integer i
      integer imax
      integer imin
      integer ip1
      integer ip2
      integer ip3
      integer ip4
      integer ip5
      integer itdkey
      integer j
      integer jmax
      integer jmin
      integer k
      integer kkey
      integer max1
      integer max2
      integer max3

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adrhokm1(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adrhokp1(ip1,ip2) = 0.d0
        end do
      end do
      do ip3 = 1, nr
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            adsigmar(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do
      do ip3 = 1, nr
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            adsigmax(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do
      do ip3 = 1, nr
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            adsigmay(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      dodiagsrho = 0
      do bj = mybyhi(mythid), mybylo(mythid), -1
        do bi = mybxhi(mythid), mybxlo(mythid), -1
          act1 = bi-mybxlo(mythid)
          max1 = mybxhi(mythid)-mybxlo(mythid)+1
          act2 = bj-mybylo(mythid)
          max2 = mybyhi(mythid)-mybylo(mythid)+1
          act3 = mythid-1
          max3 = ntx*nty
          act4 = ikey_dynamics-1
          itdkey = act1+1+act2*max1+act3*max1*max2+act4*max1*max2*max3
          imin = 1-olx
          imax = snx+olx
          jmin = 1-oly
          jmax = sny+oly
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                theta(ip1,ip2,ip3,bi,bj) = comlev1_bibj_theta_4h(ip1,
     $ip2,ip3,itdkey)
              end do
            end do
          end do
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                salt(ip1,ip2,ip3,bi,bj) = comlev1_bibj_salt_5h(ip1,ip2,
     $ip3,itdkey)
              end do
            end do
          end do
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                totphihyd(ip1,ip2,ip3,bi,bj) = 
     $comlev1_bibj_totphihyd_6h(ip1,ip2,ip3,itdkey)
              end do
            end do
          end do
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              empmr(ip1,ip2,bi,bj) = comlev1_bibj_empmr_8h(ip1,ip2,
     $itdkey)
            end do
          end do
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              pmepr(ip1,ip2,bi,bj) = comlev1_bibj_pmepr_9h(ip1,ip2,
     $itdkey)
            end do
          end do
          if (usegmredi) then
            call adgmredi_calc_tensor( adsigmax,adsigmay,adsigmar,bi,bj,
     $mythid )
          else
            call adgmredi_calc_tensor_dummy( bi,bj )
          endif
          call adexternal_forcing_surf( bi,bj,imin,imax,jmin,jmax )
          do k = 1, nr
            kkey = (itdkey-1)*nr+k
            if (usegmredi .or. k .gt. 1 .and. ivdc_kappa .ne. 0. .or. 
     $usesalt_plume .or. dodiagsrho .ge. 1) then
              call adgrad_sigma( bi,bj,k,adrhoinsitu(1-olx,1-oly,k,bi,
     $bj),adrhokm1,adrhokp1,adsigmax,adsigmay,adsigmar )
              do j = jmin, jmax
                do i = imin, imax
                  adrhoinsitu(i,j,k,bi,bj) = adrhoinsitu(i,j,k,bi,bj)+
     $adrhokp1(i,j)
                  adrhokp1(i,j) = 0.d0
                end do
              end do
              if (k .gt. 1) then
                do ip2 = 1-oly, sny+oly
                  do ip1 = 1-olx, snx+olx
                    theta(ip1,ip2,k-1,bi,bj) = comlev1_bibj_k_theta_53h(
     $ip1,ip2,kkey)
                  end do
                end do
                do ip2 = 1-oly, sny+oly
                  do ip1 = 1-olx, snx+olx
                    salt(ip1,ip2,k-1,bi,bj) = comlev1_bibj_k_salt_54h(
     $ip1,ip2,kkey)
                  end do
                end do
                call adfind_rho_2d( imin,imax,jmin,jmax,k,theta(1-olx,1-
     $oly,k-1,bi,bj),adtheta(1-olx,1-oly,k-1,bi,bj),salt(1-olx,1-oly,k-
     $1,bi,bj),adsalt(1-olx,1-oly,k-1,bi,bj),adrhokm1,bi,bj )
              endif
            endif
            if (fluidiswater) then
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  theta(ip1,ip2,k,bi,bj) = comlev1_bibj_k_theta_51h(ip1,
     $ip2,kkey)
                end do
              end do
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  salt(ip1,ip2,k,bi,bj) = comlev1_bibj_k_salt_52h(ip1,
     $ip2,kkey)
                end do
              end do
              call adfind_rho_2d( imin,imax,jmin,jmax,k,theta(1-olx,1-
     $oly,k,bi,bj),adtheta(1-olx,1-oly,k,bi,bj),salt(1-olx,1-oly,k,bi,
     $bj),adsalt(1-olx,1-oly,k,bi,bj),adrhoinsitu(1-olx,1-oly,k,bi,bj),
     $bi,bj )
            else
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  adrhoinsitu(i,j,k,bi,bj) = 0.d0
                end do
              end do
            endif
          end do
          do k = 1, nr
            do j = 1-oly, sny+oly
              do i = 1-olx, snx+olx
                adkvz(i,j,k,bi,bj) = 0.d0
                adkuz(i,j,k,bi,bj) = 0.d0
                adkvy(i,j,k,bi,bj) = 0.d0
                adkux(i,j,k,bi,bj) = 0.d0
                adsigmar(i,j,k) = 0.d0
                adsigmay(i,j,k) = 0.d0
                adsigmax(i,j,k) = 0.d0
              end do
            end do
          end do
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              adrhokp1(i,j) = 0.d0
              adrhokm1(i,j) = 0.d0
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                theta(ip1,ip2,ip3,ip4,ip5) = comlev1_theta_7h(ip1,ip2,
     $ip3,ip4,ip5,ikey_dynamics)
              end do
            end do
          end do
        end do
      end do
      if (allowfreezing) then
        call adfreeze_surface( mythid )
      endif

      end

      subroutine mddo_oceanic_phys( mytime, myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      real*8 comlev1_bibj_empmr_8h(1-olx:snx+olx,1-oly:sny+oly,120)
      common /cadempms/ comlev1_bibj_empmr_8h

      real*8 comlev1_bibj_ivdconvcount_7h(1-olx:snx+olx,1-oly:sny+oly,
     $nr,120)
      common /cadivdconvcount/ comlev1_bibj_ivdconvcount_7h

      real*8 comlev1_bibj_pmepr_9h(1-olx:snx+olx,1-oly:sny+oly,120)
      common /cadpmepr/ comlev1_bibj_pmepr_9h

      real*8 comlev1_qsw_6h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadqsw/ comlev1_qsw_6h

      real*8 comlev1_bibj_k_rhokm1_55h(1800)
      common /cadrhokm2/ comlev1_bibj_k_rhokm1_55h

      real*8 comlev1_bibj_k_salt_52h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadsal0/ comlev1_bibj_k_salt_52h

      real*8 comlev1_bibj_salt_5h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadsal1/ comlev1_bibj_salt_5h

      real*8 comlev1_bibj_k_salt_54h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadsalz/ comlev1_bibj_k_salt_54h

      real*8 comlev1_sss_5h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadsss/ comlev1_sss_5h

      real*8 comlev1_sst_4h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadsst/ comlev1_sst_4h

      real*8 comlev1_bibj_surfaceforcings_12(1-olx:snx+olx,1-oly:sny+
     $oly,120)
      common /cadsurfaceforcings/ comlev1_bibj_surfaceforcings_12

      real*8 comlev1_bibj_surfaceforcingt_13(1-olx:snx+olx,1-oly:sny+
     $oly,120)
      common /cadsurfaceforcingt/ comlev1_bibj_surfaceforcingt_13

      real*8 comlev1_bibj_surfaceforcingtice(1-olx:snx+olx,1-oly:sny+
     $oly,120)
      common /cadsurfaceforcingtice/ comlev1_bibj_surfaceforcingtice

      real*8 comlev1_bibj_surfaceforcingu_10(1-olx:snx+olx,1-oly:sny+
     $oly,120)
      common /cadsurfaceforcingu/ comlev1_bibj_surfaceforcingu_10

      real*8 comlev1_bibj_surfaceforcingv_11(1-olx:snx+olx,1-oly:sny+
     $oly,120)
      common /cadsurfaceforcingv/ comlev1_bibj_surfaceforcingv_11

      real*8 comlev1_bibj_k_theta_53h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadtheth/ comlev1_bibj_k_theta_53h

      real*8 comlev1_bibj_k_theta_51h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadtheti/ comlev1_bibj_k_theta_51h

      real*8 comlev1_bibj_theta_4h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadthetj/ comlev1_bibj_theta_4h

      real*8 comlev1_theta_7h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /cadthetk/ comlev1_theta_7h

      real*8 comlev1_bibj_totphihyd_6h(1-olx:snx+olx,1-oly:sny+oly,nr,
     $120)
      common /cadtotphihyf/ comlev1_bibj_totphihyd_6h

      double precision hmixlayer(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ivdconvcount(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision phihydlow(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rhoinsitu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision totphihyd(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_diag/ phihydlow, totphihyd, rhoinsitu, hmixlayer, 
     $ivdconvcount

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision detahdt(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision etahnm1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision pmepr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /exact_eta_local/ etahnm1, detahdt, pmepr

      double precision empmr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ffields_empmr/ empmr

      double precision qsw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ffields_qsw/ qsw

      double precision sss(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ffields_sss/ sss

      double precision sst(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ffields_sst/ sst

      double precision kux(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kvy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /gm_hortensor/ kux, kvy

      double precision kuz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kvz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /gm_uvtensor/ kuz, kvz

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      double precision surfaceforcings(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy)
      double precision surfaceforcingt(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy)
      double precision surfaceforcingtice(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision surfaceforcingu(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy)
      double precision surfaceforcingv(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy)
      common /surface_forcing/ surfaceforcingu, surfaceforcingv, 
     $surfaceforcingt, surfaceforcings, surfaceforcingtice

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      integer myiter
      integer mythid
      double precision mytime

C==============================================
C declare local variables
C==============================================
      integer act1
      integer act2
      integer act3
      integer act4
      integer bi
      integer bj
      integer dodiagsrho
      integer help_h
      integer i
      integer imax
      integer imin
      integer it0
      integer it1
      integer it2
      integer it3
      integer it4
      integer it5
      integer it6
      integer it7
      integer it8
      integer itdkey
      integer its
      integer itt
      integer itu
      integer itv
      integer itw
      integer itx
      integer ity
      integer itz
      integer iu0
      integer iu1
      integer iu2
      integer iu3
      integer iu4
      integer iu5
      integer iu6
      integer iu7
      integer iu8
      integer iu9
      integer iuh
      integer iui
      integer iuj
      integer iuk
      integer iul
      integer ium
      integer iun
      integer iuo
      integer iup
      integer iuq
      integer iur
      integer ius
      integer iut
      integer iuu
      integer iuv
      integer iuw
      integer iux
      integer iuy
      integer iuz
      integer iva
      integer j
      integer jmax
      integer jmin
      integer k
      integer kkey
      integer max1
      integer max2
      integer max3
      double precision rhokm1(1-olx:snx+olx,1-oly:sny+oly)
      double precision rhokp1(1-olx:snx+olx,1-oly:sny+oly)
      double precision sigmar(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision sigmax(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision sigmay(1-olx:snx+olx,1-oly:sny+oly,nr)

C**********************************************
C executable statements of routine
C**********************************************
      dodiagsrho = 0
      do iva = 1, nsy
        do iu9 = 1, nsx
          do iu8 = 1-oly, sny+oly
            do iu7 = 1-olx, snx+olx
              comlev1_sst_4h(iu7,iu8,iu9,iva,ikey_dynamics) = sst(iu7,
     $iu8,iu9,iva)
            end do
          end do
        end do
      end do
      do iva = 1, nsy
        do iu9 = 1, nsx
          do iu8 = 1-oly, sny+oly
            do iu7 = 1-olx, snx+olx
              comlev1_sss_5h(iu7,iu8,iu9,iva,ikey_dynamics) = sss(iu7,
     $iu8,iu9,iva)
            end do
          end do
        end do
      end do
      do iu6 = 1, nsy
        do iu5 = 1, nsx
          do iu4 = 1-oly, sny+oly
            do iu3 = 1-olx, snx+olx
              comlev1_qsw_6h(iu3,iu4,iu5,iu6,ikey_dynamics) = qsw(iu3,
     $iu4,iu5,iu6)
            end do
          end do
        end do
      end do
      do iu2 = 1, nsy
        do iu1 = 1, nsx
          do iu0 = 1, nr
            do iuz = 1-oly, sny+oly
              do iuy = 1-olx, snx+olx
                comlev1_theta_7h(iuy,iuz,iu0,iu1,iu2,ikey_dynamics) = 
     $theta(iuy,iuz,iu0,iu1,iu2)
              end do
            end do
          end do
        end do
      end do
      if (allowfreezing) then
        call freeze_surface( mytime,myiter,mythid )
      endif
      do bj = mybylo(mythid), mybyhi(mythid)
        do bi = mybxlo(mythid), mybxhi(mythid)
          act1 = bi-mybxlo(mythid)
          max1 = mybxhi(mythid)-mybxlo(mythid)+1
          act2 = bj-mybylo(mythid)
          max2 = mybyhi(mythid)-mybylo(mythid)+1
          act3 = mythid-1
          max3 = ntx*nty
          act4 = ikey_dynamics-1
          itdkey = act1+1+act2*max1+act3*max1*max2+act4*max1*max2*max3
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              rhokm1(i,j) = 0.d0
              rhokp1(i,j) = 0.d0
            end do
          end do
          do k = 1, nr
            do j = 1-oly, sny+oly
              do i = 1-olx, snx+olx
                sigmax(i,j,k) = 0.d0
                sigmay(i,j,k) = 0.d0
                sigmar(i,j,k) = 0.d0
                ivdconvcount(i,j,k,bi,bj) = 0.
                kux(i,j,k,bi,bj) = 0.d0
                kvy(i,j,k,bi,bj) = 0.d0
                kuz(i,j,k,bi,bj) = 0.d0
                kvz(i,j,k,bi,bj) = 0.d0
              end do
            end do
          end do
          imin = 1-olx
          imax = snx+olx
          jmin = 1-oly
          jmax = sny+oly
          do iux = 1, nr
            do iuw = 1-oly, sny+oly
              do iuv = 1-olx, snx+olx
                comlev1_bibj_theta_4h(iuv,iuw,iux,itdkey) = theta(iuv,
     $iuw,iux,bi,bj)
              end do
            end do
          end do
          do iuu = 1, nr
            do iut = 1-oly, sny+oly
              do ius = 1-olx, snx+olx
                comlev1_bibj_salt_5h(ius,iut,iuu,itdkey) = salt(ius,iut,
     $iuu,bi,bj)
              end do
            end do
          end do
          do iur = 1, nr
            do iuq = 1-oly, sny+oly
              do iup = 1-olx, snx+olx
                comlev1_bibj_totphihyd_6h(iup,iuq,iur,itdkey) = 
     $totphihyd(iup,iuq,iur,bi,bj)
              end do
            end do
          end do
          do k = nr, 1, -1
            kkey = (itdkey-1)*nr+k
            if (fluidiswater) then
              do iuo = 1-oly, sny+oly
                do iun = 1-olx, snx+olx
                  comlev1_bibj_k_theta_51h(iun,iuo,kkey) = theta(iun,
     $iuo,k,bi,bj)
                end do
              end do
              do ium = 1-oly, sny+oly
                do iul = 1-olx, snx+olx
                  comlev1_bibj_k_salt_52h(iul,ium,kkey) = salt(iul,ium,
     $k,bi,bj)
                end do
              end do
              call find_rho_2d( imin,imax,jmin,jmax,k,theta(1-olx,1-oly,
     $k,bi,bj),salt(1-olx,1-oly,k,bi,bj),rhoinsitu(1-olx,1-oly,k,bi,bj),
     $k,bi,bj,mythid )
            else
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  rhoinsitu(i,j,k,bi,bj) = 0.
                end do
              end do
            endif
            if (usegmredi .or. k .gt. 1 .and. ivdc_kappa .ne. 0. .or. 
     $usesalt_plume .or. dodiagsrho .ge. 1) then
              if (k .gt. 1) then
                do iuk = 1-oly, sny+oly
                  do iuj = 1-olx, snx+olx
                    comlev1_bibj_k_theta_53h(iuj,iuk,kkey) = theta(iuj,
     $iuk,k-1,bi,bj)
                  end do
                end do
                do iui = 1-oly, sny+oly
                  do iuh = 1-olx, snx+olx
                    comlev1_bibj_k_salt_54h(iuh,iui,kkey) = salt(iuh,
     $iui,k-1,bi,bj)
                  end do
                end do
                comlev1_bibj_k_rhokm1_55h(kkey) = rhokm1(bi,bj)
                call find_rho_2d( imin,imax,jmin,jmax,k,theta(1-olx,1-
     $oly,k-1,bi,bj),salt(1-olx,1-oly,k-1,bi,bj),rhokm1,help_h,bi,bj,
     $mythid )
              endif
              do j = jmin, jmax
                do i = imin, imax
                  rhokp1(i,j) = rhoinsitu(i,j,k,bi,bj)
                end do
              end do
              call grad_sigma( bi,bj,imin,imax,jmin,jmax,k,rhoinsitu(1-
     $olx,1-oly,k,bi,bj),rhokm1,rhokp1,sigmax,sigmay,sigmar,mythid )
            endif
            if (k .gt. 1 .and. ivdc_kappa .ne. 0.) then
              call calc_ivdc( bi,bj,imin,imax,jmin,jmax,k,rhokm1,
     $rhoinsitu(1-olx,1-oly,k,bi,bj),mytime,myiter,mythid )
            endif
          end do
          do it8 = 1, nr
            do it7 = 1-oly, sny+oly
              do it6 = 1-olx, snx+olx
                comlev1_bibj_ivdconvcount_7h(it6,it7,it8,itdkey) = 
     $ivdconvcount(it6,it7,it8,bi,bj)
              end do
            end do
          end do
          do it5 = 1-oly, sny+oly
            do it4 = 1-olx, snx+olx
              comlev1_bibj_empmr_8h(it4,it5,itdkey) = empmr(it4,it5,bi,
     $bj)
            end do
          end do
          do it3 = 1-oly, sny+oly
            do it2 = 1-olx, snx+olx
              comlev1_bibj_pmepr_9h(it2,it3,itdkey) = pmepr(it2,it3,bi,
     $bj)
            end do
          end do
          call external_forcing_surf( bi,bj,imin,imax,jmin,jmax,mytime,
     $myiter,mythid )
          do it1 = 1-oly, sny+oly
            do it0 = 1-olx, snx+olx
              comlev1_bibj_surfaceforcingu_10(it0,it1,itdkey) = 
     $surfaceforcingu(it0,it1,bi,bj)
            end do
          end do
          do itz = 1-oly, sny+oly
            do ity = 1-olx, snx+olx
              comlev1_bibj_surfaceforcingv_11(ity,itz,itdkey) = 
     $surfaceforcingv(ity,itz,bi,bj)
            end do
          end do
          do itx = 1-oly, sny+oly
            do itw = 1-olx, snx+olx
              comlev1_bibj_surfaceforcings_12(itw,itx,itdkey) = 
     $surfaceforcings(itw,itx,bi,bj)
            end do
          end do
          do itv = 1-oly, sny+oly
            do itu = 1-olx, snx+olx
              comlev1_bibj_surfaceforcingt_13(itu,itv,itdkey) = 
     $surfaceforcingt(itu,itv,bi,bj)
            end do
          end do
          do itt = 1-oly, sny+oly
            do its = 1-olx, snx+olx
              comlev1_bibj_surfaceforcingtice(its,itt,itdkey) = 
     $surfaceforcingtice(its,itt,bi,bj)
            end do
          end do
          if (usegmredi) then
            call mdgmredi_calc_tensor( imin,imax,jmin,jmax,sigmax,
     $sigmay,sigmar,bi,bj,mytime,myiter,mythid )
          else
            call gmredi_calc_tensor_dummy( imin,imax,jmin,jmax,sigmax,
     $sigmay,sigmar,bi,bj,mytime,myiter,mythid )
          endif
        end do
      end do
      end

      subroutine addo_stagger_fields_exchanges( mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

C==============================================
C declare arguments
C==============================================
      integer mythid

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (implicitintgravwave) then
        call adexch_xyz_rl( adgs,mythid )
        call adexch_xyz_rl( adgt,mythid )
      endif
      if (staggertimestep .and. usemultidimadvec) then
        if ( .not. implicitintgravwave) then
          call adexch_xyz_rl( adwvel,mythid )
        endif
        call adexch_uv_xyz_rl( aduvel,advvel, .true. ,mythid )
      endif

      end

      subroutine addynamics( myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetanm1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduveld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advveld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_cd/ aduveld, advveld, adetanm1, adunm1, advnm1

      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      real*8 comlev1_bibj_gv_23h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadgv/ comlev1_bibj_gv_23h

      real*8 comlev1_bibj_gu_21h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadgw/ comlev1_bibj_gu_21h

      real*8 comlev1_bibj_k_gs_61h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadgx/ comlev1_bibj_k_gs_61h

      real*8 comlev1_bibj_k_gt_60h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadgy/ comlev1_bibj_k_gt_60h

      real*8 comlev1_bibj_kapparu_20h(1-olx:snx+olx,1-oly:sny+oly,nr,
     $120)
      common /cadkapparu/ comlev1_bibj_kapparu_20h

      real*8 comlev1_bibj_kapparv_22h(1-olx:snx+olx,1-oly:sny+oly,nr,
     $120)
      common /cadkapparv/ comlev1_bibj_kapparv_22h

      real*8 comlev1_bibj_kapparv_19h(1-olx:snx+olx,1-oly:sny+oly,nr,
     $120)
      common /cadkapparw/ comlev1_bibj_kapparv_19h

      real*8 comlev1_bibj_kapparu_18h(1-olx:snx+olx,1-oly:sny+oly,nr,
     $120)
      common /cadkapparx/ comlev1_bibj_kapparu_18h

      real*8 comlev1_bibj_k_salt_59h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadsaly/ comlev1_bibj_k_salt_59h

      real*8 comlev1_bibj_k_theta_58h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadthetg/ comlev1_bibj_k_theta_58h

      real*8 comlev1_bibj_k_totphihyd_56h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadtotphihye/ comlev1_bibj_k_totphihyd_56h

      real*8 comlev1_bibj_uveld_25h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /caduveld/ comlev1_bibj_uveld_25h

      real*8 comlev1_bibj_uvel_16h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /caduven/ comlev1_bibj_uvel_16h

      real*8 comlev1_bibj_vveld_24h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadvveld/ comlev1_bibj_vveld_24h

      real*8 comlev1_bibj_vvel_17h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadvven/ comlev1_bibj_vvel_17h

      real*8 comlev1_bibj_wvel_15h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadwven/ comlev1_bibj_wvel_15h

      double precision etanm1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision unm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uveld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vveld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_cd/ uveld, vveld, etanm1, unm1, vnm1

      double precision hmixlayer(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ivdconvcount(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision phihydlow(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rhoinsitu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision totphihyd(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_diag/ phihydlow, totphihyd, rhoinsitu, hmixlayer, 
     $ivdconvcount

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      integer myiter
      integer mythid

C==============================================
C declare local variables
C==============================================
      integer act1
      integer act2
      integer act3
      integer act4
      double precision addphihydx(1-olx:snx+olx,1-oly:sny+oly)
      double precision addphihydy(1-olx:snx+olx,1-oly:sny+oly)
      double precision adfveru(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision adfverv(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision adgudissip(1-olx:snx+olx,1-oly:sny+oly)
      double precision adgvdissip(1-olx:snx+olx,1-oly:sny+oly)
      double precision adkapparuh(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adkapparui(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adkapparvh(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adkapparvi(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adphihydc(1-olx:snx+olx,1-oly:sny+oly)
      double precision adphihydf(1-olx:snx+olx,1-oly:sny+oly)
      double precision adphisurfx(1-olx:snx+olx,1-oly:sny+oly)
      double precision adphisurfy(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer help_h
      integer help_i
      integer i
      integer idynkey
      integer imax
      integer imin
      integer ip1
      integer ip2
      integer ip3
      integer j
      integer jmax
      integer jmin
      integer k
      double precision kapparu(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision kapparv(1-olx:snx+olx,1-oly:sny+oly,nr)
      integer kdown
      integer kkey
      integer kup
      integer max1
      integer max2
      integer max3

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          addphihydx(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          addphihydy(ip1,ip2) = 0.d0
        end do
      end do
      do ip3 = 1, 2
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            adfveru(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do
      do ip3 = 1, 2
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            adfverv(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adgudissip(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adgvdissip(ip1,ip2) = 0.d0
        end do
      end do
      do ip3 = 1, nr
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            adkapparuh(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do
      do ip3 = 1, nr
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            adkapparui(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do
      do ip3 = 1, nr
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            adkapparvh(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do
      do ip3 = 1, nr
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            adkapparvi(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adphihydc(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adphihydf(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adphisurfx(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adphisurfy(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do bj = mybyhi(mythid), mybylo(mythid), -1
        do bi = mybxhi(mythid), mybxlo(mythid), -1
          act1 = bi-mybxlo(mythid)
          max1 = mybxhi(mythid)-mybxlo(mythid)+1
          act2 = bj-mybylo(mythid)
          max2 = mybyhi(mythid)-mybylo(mythid)+1
          act3 = mythid-1
          max3 = ntx*nty
          act4 = ikey_dynamics-1
          idynkey = act1+1+act2*max1+act3*max1*max2+act4*max1*max2*max3
          imin = 0
          imax = snx+1
          jmin = 0
          jmax = sny+1
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                wvel(ip1,ip2,ip3,bi,bj) = comlev1_bibj_wvel_15h(ip1,ip2,
     $ip3,idynkey)
              end do
            end do
          end do
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                uvel(ip1,ip2,ip3,bi,bj) = comlev1_bibj_uvel_16h(ip1,ip2,
     $ip3,idynkey)
              end do
            end do
          end do
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                vvel(ip1,ip2,ip3,bi,bj) = comlev1_bibj_vvel_17h(ip1,ip2,
     $ip3,idynkey)
              end do
            end do
          end do
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                kapparu(ip1,ip2,ip3) = comlev1_bibj_kapparu_18h(ip1,ip2,
     $ip3,idynkey)
              end do
            end do
          end do
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                kapparv(ip1,ip2,ip3) = comlev1_bibj_kapparv_19h(ip1,ip2,
     $ip3,idynkey)
              end do
            end do
          end do
          if (implicitviscosity .and. usecdscheme) then
            do ip3 = 1, nr
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  vveld(ip1,ip2,ip3,bi,bj) = comlev1_bibj_vveld_24h(ip1,
     $ip2,ip3,idynkey)
                end do
              end do
            end do
            do ip3 = 1, nr
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  uveld(ip1,ip2,ip3,bi,bj) = comlev1_bibj_uveld_25h(ip1,
     $ip2,ip3,idynkey)
                end do
              end do
            end do
            call adimpldiff( bi,bj,imin,imax,jmin,jmax,0,kapparv,
     $adkapparvh,recip_hfacs,uveld,aduveld )
            call adimpldiff( bi,bj,imin,imax,jmin,jmax,0,kapparu,
     $adkapparuh,recip_hfacw,vveld,advveld )
          endif
          if (implicitviscosity) then
            do ip3 = 1, nr
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  kapparu(ip1,ip2,ip3) = comlev1_bibj_kapparu_20h(ip1,
     $ip2,ip3,idynkey)
                end do
              end do
            end do
            do ip3 = 1, nr
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  gu(ip1,ip2,ip3,bi,bj) = comlev1_bibj_gu_21h(ip1,ip2,
     $ip3,idynkey)
                end do
              end do
            end do
            help_h = -1
            do ip3 = 1, nr
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  kapparv(ip1,ip2,ip3) = comlev1_bibj_kapparv_22h(ip1,
     $ip2,ip3,idynkey)
                end do
              end do
            end do
            do ip3 = 1, nr
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  gv(ip1,ip2,ip3,bi,bj) = comlev1_bibj_gv_23h(ip1,ip2,
     $ip3,idynkey)
                end do
              end do
            end do
            help_i = -2
            call adimpldiff( bi,bj,imin,imax,jmin,jmax,help_i,kapparv,
     $adkapparvi,recip_hfacs,gv,adgv )
            call adimpldiff( bi,bj,imin,imax,jmin,jmax,help_h,kapparu,
     $adkapparui,recip_hfacw,gu,adgu )
          endif
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                kapparu(ip1,ip2,ip3) = comlev1_bibj_kapparu_18h(ip1,ip2,
     $ip3,idynkey)
              end do
            end do
          end do
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                kapparv(ip1,ip2,ip3) = comlev1_bibj_kapparv_19h(ip1,ip2,
     $ip3,idynkey)
              end do
            end do
          end do
          do k = nr, 1, -1
            kup = 1+mod(k+1,2)
            kdown = 1+mod(k,2)
            kkey = (idynkey-1)*nr+k
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                totphihyd(ip1,ip2,k,bi,bj) = 
     $comlev1_bibj_k_totphihyd_56h(ip1,ip2,kkey)
              end do
            end do
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                theta(ip1,ip2,k,bi,bj) = comlev1_bibj_k_theta_58h(ip1,
     $ip2,kkey)
              end do
            end do
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                salt(ip1,ip2,k,bi,bj) = comlev1_bibj_k_salt_59h(ip1,ip2,
     $kkey)
              end do
            end do
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                gt(ip1,ip2,k,bi,bj) = comlev1_bibj_k_gt_60h(ip1,ip2,
     $kkey)
              end do
            end do
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                gs(ip1,ip2,k,bi,bj) = comlev1_bibj_k_gs_61h(ip1,ip2,
     $kkey)
              end do
            end do
            if (momstepping) then
              call adtimestep( bi,bj,imin,imax,jmin,jmax,k,addphihydx,
     $addphihydy,adphisurfx,adphisurfy,adgudissip,adgvdissip,myiter )
              if ( .not. vectorinvariantmomentum) then
                call admom_fluxform( bi,bj,imin,imax,jmin,jmax,k,kup,
     $kdown,kapparu,kapparv,adfveru,adfverv,adgudissip,adgvdissip,
     $mythid )
              else
                call admom_vecinv( bi,bj,imin,imax,jmin,jmax,k,kup,
     $kdown,kapparu,kapparv,adfveru,adfverv,adgudissip,adgvdissip,
     $mythid )
              endif
            endif
            if (implicitintgravwave) then
              call adcalc_phi_hyd( bi,bj,imin,imax,jmin,jmax,k,gt,adgt,
     $gs,adgs,adphihydf,adphihydc,addphihydx,addphihydy,myiter,mythid )
            else
              call adcalc_phi_hyd( bi,bj,imin,imax,jmin,jmax,k,theta,
     $adtheta,salt,adsalt,adphihydf,adphihydc,addphihydx,addphihydy,
     $myiter,mythid )
            endif
          end do
          if (implicsurfpress .ne. 1.) then
            call adcalc_grad_phi_surf( bi,bj,imin,imax,jmin,jmax,adetan,
     $adphisurfx,adphisurfy )
          endif
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              adphisurfy(i,j) = 0.d0
              adphisurfx(i,j) = 0.d0
              adphihydc(i,j) = 0.d0
              adphihydf(i,j) = 0.d0
              adfverv(i,j,2) = 0.d0
              adfverv(i,j,1) = 0.d0
              adfveru(i,j,2) = 0.d0
              adfveru(i,j,1) = 0.d0
            end do
          end do
          do k = 1, nr
            do j = 1-oly, sny+oly
              do i = 1-olx, snx+olx
                adgv(i,j,k,bi,bj) = 0.d0
                adgu(i,j,k,bi,bj) = 0.d0
              end do
            end do
          end do
        end do
      end do

      end

      subroutine mddynamics( mytime, myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      real*8 comlev1_bibj_gv_23h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadgv/ comlev1_bibj_gv_23h

      real*8 comlev1_bibj_gu_21h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadgw/ comlev1_bibj_gu_21h

      real*8 comlev1_bibj_k_gs_61h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadgx/ comlev1_bibj_k_gs_61h

      real*8 comlev1_bibj_k_gt_60h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadgy/ comlev1_bibj_k_gt_60h

      real*8 comlev1_bibj_kapparu_20h(1-olx:snx+olx,1-oly:sny+oly,nr,
     $120)
      common /cadkapparu/ comlev1_bibj_kapparu_20h

      real*8 comlev1_bibj_kapparv_22h(1-olx:snx+olx,1-oly:sny+oly,nr,
     $120)
      common /cadkapparv/ comlev1_bibj_kapparv_22h

      real*8 comlev1_bibj_kapparv_19h(1-olx:snx+olx,1-oly:sny+oly,nr,
     $120)
      common /cadkapparw/ comlev1_bibj_kapparv_19h

      real*8 comlev1_bibj_kapparu_18h(1-olx:snx+olx,1-oly:sny+oly,nr,
     $120)
      common /cadkapparx/ comlev1_bibj_kapparu_18h

      real*8 comlev1_bibj_k_phihydlow_57h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadphihydlow/ comlev1_bibj_k_phihydlow_57h

      real*8 comlev1_bibj_k_salt_59h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadsaly/ comlev1_bibj_k_salt_59h

      real*8 comlev1_bibj_k_theta_58h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadthetg/ comlev1_bibj_k_theta_58h

      real*8 comlev1_bibj_k_totphihyd_56h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadtotphihye/ comlev1_bibj_k_totphihyd_56h

      real*8 comlev1_bibj_uveld_25h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /caduveld/ comlev1_bibj_uveld_25h

      real*8 comlev1_bibj_uvel_16h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /caduven/ comlev1_bibj_uvel_16h

      real*8 comlev1_bibj_vveld_24h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadvveld/ comlev1_bibj_vveld_24h

      real*8 comlev1_bibj_vvel_17h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadvven/ comlev1_bibj_vvel_17h

      real*8 comlev1_bibj_wvel_15h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadwven/ comlev1_bibj_wvel_15h

      double precision etanm1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision unm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uveld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vveld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_cd/ uveld, vveld, etanm1, unm1, vnm1

      double precision hmixlayer(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ivdconvcount(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision phihydlow(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rhoinsitu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision totphihyd(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_diag/ phihydlow, totphihyd, rhoinsitu, hmixlayer, 
     $ivdconvcount

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      integer myiter
      integer mythid
      double precision mytime

C==============================================
C declare local variables
C==============================================
      integer act1
      integer act2
      integer act3
      integer act4
      integer bi
      integer bj
      double precision dphihydx(1-olx:snx+olx,1-oly:sny+oly)
      double precision dphihydy(1-olx:snx+olx,1-oly:sny+oly)
      double precision fveru(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision fverv(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision gudissip(1-olx:snx+olx,1-oly:sny+oly)
      double precision gvdissip(1-olx:snx+olx,1-oly:sny+oly)
      integer help_h
      integer help_i
      integer i
      integer idynkey
      integer imax
      integer imin
      integer iu1
      integer iu2
      integer iu3
      integer iu4
      integer iu5
      integer iu6
      integer iu7
      integer iu8
      integer iu9
      integer iv0
      integer iv1
      integer iv2
      integer iv3
      integer iv4
      integer iv5
      integer iv6
      integer iv7
      integer iv8
      integer iv9
      integer iva
      integer ivb
      integer ivc
      integer ivd
      integer ive
      integer ivf
      integer ivg
      integer ivh
      integer ivi
      integer ivv
      integer ivw
      integer ivx
      integer ivy
      integer ivz
      integer iwa
      integer iwb
      integer iwc
      integer iwd
      integer iwe
      integer iwf
      integer iwg
      integer iwh
      integer iwi
      integer iwj
      integer iwk
      integer iwl
      integer j
      integer jmax
      integer jmin
      integer k
      double precision kapparu(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision kapparv(1-olx:snx+olx,1-oly:sny+oly,nr)
      integer kdown
      integer kkey
      integer kup
      integer max1
      integer max2
      integer max3
      double precision phihydc(1-olx:snx+olx,1-oly:sny+oly)
      double precision phihydf(1-olx:snx+olx,1-oly:sny+oly)
      double precision phisurfx(1-olx:snx+olx,1-oly:sny+oly)
      double precision phisurfy(1-olx:snx+olx,1-oly:sny+oly)

C**********************************************
C executable statements of routine
C**********************************************
      do bj = mybylo(mythid), mybyhi(mythid)
        do bi = mybxlo(mythid), mybxhi(mythid)
          act1 = bi-mybxlo(mythid)
          max1 = mybxhi(mythid)-mybxlo(mythid)+1
          act2 = bj-mybylo(mythid)
          max2 = mybyhi(mythid)-mybylo(mythid)+1
          act3 = mythid-1
          max3 = ntx*nty
          act4 = ikey_dynamics-1
          idynkey = act1+1+act2*max1+act3*max1*max2+act4*max1*max2*max3
          do k = 1, nr
            do j = 1-oly, sny+oly
              do i = 1-olx, snx+olx
                gu(i,j,k,bi,bj) = 0.d0
                gv(i,j,k,bi,bj) = 0.d0
              end do
            end do
          end do
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              fveru(i,j,1) = 0.d0
              fveru(i,j,2) = 0.d0
              fverv(i,j,1) = 0.d0
              fverv(i,j,2) = 0.d0
              phihydf(i,j) = 0.d0
              phihydc(i,j) = 0.d0
              phisurfx(i,j) = 0.d0
              phisurfy(i,j) = 0.d0
              gudissip(i,j) = 0.d0
              gvdissip(i,j) = 0.d0
              phihydlow(i,j,bi,bj) = 0.d0
            end do
          end do
          imin = 0
          imax = snx+1
          jmin = 0
          jmax = sny+1
          do iwl = 1, nr
            do iwk = 1-oly, sny+oly
              do iwj = 1-olx, snx+olx
                comlev1_bibj_wvel_15h(iwj,iwk,iwl,idynkey) = wvel(iwj,
     $iwk,iwl,bi,bj)
              end do
            end do
          end do
          if (implicsurfpress .ne. 1.) then
            call calc_grad_phi_surf( bi,bj,imin,imax,jmin,jmax,etan,
     $phisurfx,phisurfy,mythid )
          endif
          do iwi = 1, nr
            do iwh = 1-oly, sny+oly
              do iwg = 1-olx, snx+olx
                comlev1_bibj_uvel_16h(iwg,iwh,iwi,idynkey) = uvel(iwg,
     $iwh,iwi,bi,bj)
              end do
            end do
          end do
          do iwf = 1, nr
            do iwe = 1-oly, sny+oly
              do iwd = 1-olx, snx+olx
                comlev1_bibj_vvel_17h(iwd,iwe,iwf,idynkey) = vvel(iwd,
     $iwe,iwf,bi,bj)
              end do
            end do
          end do
          call calc_viscosity( bi,bj,imin,imax,jmin,jmax,kapparu,
     $kapparv,mythid )
          do iwc = 1, nr
            do iwb = 1-oly, sny+oly
              do iwa = 1-olx, snx+olx
                comlev1_bibj_kapparu_18h(iwa,iwb,iwc,idynkey) = kapparu(
     $iwa,iwb,iwc)
              end do
            end do
          end do
          do iv9 = 1, nr
            do iv8 = 1-oly, sny+oly
              do iv7 = 1-olx, snx+olx
                comlev1_bibj_kapparv_19h(iv7,iv8,iv9,idynkey) = kapparv(
     $iv7,iv8,iv9)
              end do
            end do
          end do
          do k = 1, nr
            kup = 1+mod(k+1,2)
            kdown = 1+mod(k,2)
            kkey = (idynkey-1)*nr+k
            do iv6 = 1-oly, sny+oly
              do iv5 = 1-olx, snx+olx
                comlev1_bibj_k_totphihyd_56h(iv5,iv6,kkey) = totphihyd(
     $iv5,iv6,k,bi,bj)
              end do
            end do
            do iv4 = 1-oly, sny+oly
              do iv3 = 1-olx, snx+olx
                comlev1_bibj_k_phihydlow_57h(iv3,iv4,kkey) = phihydlow(
     $iv3,iv4,bi,bj)
              end do
            end do
            do iv2 = 1-oly, sny+oly
              do iv1 = 1-olx, snx+olx
                comlev1_bibj_k_theta_58h(iv1,iv2,kkey) = theta(iv1,iv2,
     $k,bi,bj)
              end do
            end do
            do iv0 = 1-oly, sny+oly
              do ivz = 1-olx, snx+olx
                comlev1_bibj_k_salt_59h(ivz,iv0,kkey) = salt(ivz,iv0,k,
     $bi,bj)
              end do
            end do
            do ivy = 1-oly, sny+oly
              do ivx = 1-olx, snx+olx
                comlev1_bibj_k_gt_60h(ivx,ivy,kkey) = gt(ivx,ivy,k,bi,
     $bj)
              end do
            end do
            do ivw = 1-oly, sny+oly
              do ivv = 1-olx, snx+olx
                comlev1_bibj_k_gs_61h(ivv,ivw,kkey) = gs(ivv,ivw,k,bi,
     $bj)
              end do
            end do
            if (implicitintgravwave) then
              call mdcalc_phi_hyd( bi,bj,imin,imax,jmin,jmax,k,gt,gs,
     $phihydf,phihydc,dphihydx,dphihydy,mytime,myiter,mythid )
            else
              call mdcalc_phi_hyd( bi,bj,imin,imax,jmin,jmax,k,theta,
     $salt,phihydf,phihydc,dphihydx,dphihydy,mytime,myiter,mythid )
            endif
            if (momstepping) then
              if ( .not. vectorinvariantmomentum) then
                call mdmom_fluxform( bi,bj,imin,imax,jmin,jmax,k,kup,
     $kdown,kapparu,kapparv,fveru,fverv,gudissip,gvdissip,mytime,myiter,
     $mythid )
              else
                call mdmom_vecinv( bi,bj,imin,imax,jmin,jmax,k,kup,
     $kdown,kapparu,kapparv,fveru,fverv,gudissip,gvdissip,mytime,myiter,
     $mythid )
              endif
              call timestep( bi,bj,imin,imax,jmin,jmax,k,dphihydx,
     $dphihydy,phisurfx,phisurfy,gudissip,gvdissip,mytime,myiter,mythid 
     $)
            endif
          end do
          if (implicitviscosity) then
            do ivi = 1, nr
              do ivh = 1-oly, sny+oly
                do ivg = 1-olx, snx+olx
                  comlev1_bibj_kapparu_20h(ivg,ivh,ivi,idynkey) = 
     $kapparu(ivg,ivh,ivi)
                end do
              end do
            end do
            do ivf = 1, nr
              do ive = 1-oly, sny+oly
                do ivd = 1-olx, snx+olx
                  comlev1_bibj_gu_21h(ivd,ive,ivf,idynkey) = gu(ivd,ive,
     $ivf,bi,bj)
                end do
              end do
            end do
            help_h = -1
            call impldiff( bi,bj,imin,imax,jmin,jmax,help_h,kapparu,
     $recip_hfacw,gu,mythid )
            do ivc = 1, nr
              do ivb = 1-oly, sny+oly
                do iva = 1-olx, snx+olx
                  comlev1_bibj_kapparv_22h(iva,ivb,ivc,idynkey) = 
     $kapparv(iva,ivb,ivc)
                end do
              end do
            end do
            do iu9 = 1, nr
              do iu8 = 1-oly, sny+oly
                do iu7 = 1-olx, snx+olx
                  comlev1_bibj_gv_23h(iu7,iu8,iu9,idynkey) = gv(iu7,iu8,
     $iu9,bi,bj)
                end do
              end do
            end do
            help_i = -2
            call impldiff( bi,bj,imin,imax,jmin,jmax,help_i,kapparv,
     $recip_hfacs,gv,mythid )
          endif
          if (implicitviscosity .and. usecdscheme) then
            do iu6 = 1, nr
              do iu5 = 1-oly, sny+oly
                do iu4 = 1-olx, snx+olx
                  comlev1_bibj_vveld_24h(iu4,iu5,iu6,idynkey) = vveld(
     $iu4,iu5,iu6,bi,bj)
                end do
              end do
            end do
            call impldiff( bi,bj,imin,imax,jmin,jmax,0,kapparu,
     $recip_hfacw,vveld,mythid )
            do iu3 = 1, nr
              do iu2 = 1-oly, sny+oly
                do iu1 = 1-olx, snx+olx
                  comlev1_bibj_uveld_25h(iu1,iu2,iu3,idynkey) = uveld(
     $iu1,iu2,iu3,bi,bj)
                end do
              end do
            end do
            call impldiff( bi,bj,imin,imax,jmin,jmax,0,kapparv,
     $recip_hfacs,uveld,mythid )
          endif
        end do
      end do
      end

      subroutine adexch_uv_3d_rl( aduphi, advphi, withsigns, mynz, 
     $mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer exch_update_corners
      parameter ( exch_update_corners = 1 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

C==============================================
C declare arguments
C==============================================
      integer mynz
      double precision aduphi(1-olx:snx+olx,1-oly:sny+oly,mynz,nsx,nsy)
      double precision advphi(1-olx:snx+olx,1-oly:sny+oly,mynz,nsx,nsy)
      integer mythid
      logical withsigns

C==============================================
C declare local variables
C==============================================
      integer exchwidthx
      integer exchwidthy
      integer ole
      integer oln
      integer ols
      integer olw

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      olw = olx
      ole = olx
      oln = oly
      ols = oly
      exchwidthx = olx
      exchwidthy = oly
      if (usecubedsphereexchange) then
        call exch1_rl_cube_ad( aduphi,advphi,withsigns,olw,ole,ols,oln,
     $mynz,exchwidthx,exchwidthy,exch_update_corners,mythid )
      else
        call exch1_rl_ad( advphi,olw,ole,ols,oln,mynz,exchwidthx,
     $exchwidthy,exch_update_corners,mythid )
        call exch1_rl_ad( aduphi,olw,ole,ols,oln,mynz,exchwidthx,
     $exchwidthy,exch_update_corners,mythid )
      endif

      end

      subroutine adexch_uv_dgrid_3d_rl( aduphi, advphi, withsigns, mynz,
     $ mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer exch_update_corners
      parameter ( exch_update_corners = 1 )
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

C==============================================
C declare arguments
C==============================================
      integer mynz
      double precision aduphi(1-olx:snx+olx,1-oly:sny+oly,mynz,nsx,nsy)
      double precision advphi(1-olx:snx+olx,1-oly:sny+oly,mynz,nsx,nsy)
      integer mythid
      logical withsigns

C==============================================
C declare local variables
C==============================================
      integer bi
      integer bj
      integer exchwidthx
      integer exchwidthy
      integer i
      integer j
      integer k
      integer myface
      double precision negone
      integer ole
      integer oln
      integer ols
      integer olw

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      olw = olx
      ole = olx
      oln = oly
      ols = oly
      exchwidthx = olx
      exchwidthy = oly
      negone = 1.
      if (withsigns) then
        negone = -1.
      endif
      if (usecubedsphereexchange) then
        do bj = mybylo(mythid), mybyhi(mythid)
          do bi = mybxlo(mythid), mybxhi(mythid)
            myface = bi
            do k = 1, mynz
              if (mod(myface,2) .eq. 1) then
                do j = 1-oly, sny+oly
                  do i = 1, exchwidthx
                    advphi(1-i,j,k,bi,bj) = advphi(1-i,j,k,bi,bj)*negone
                  end do
                end do
                do j = 1, exchwidthy
                  do i = 1-olx, snx+olx
                    aduphi(i,sny+j,k,bi,bj) = aduphi(i,sny+j,k,bi,bj)*
     $negone
                  end do
                end do
              else
                do j = 1, exchwidthy
                  do i = 1-olx, snx+olx
                    aduphi(i,1-j,k,bi,bj) = aduphi(i,1-j,k,bi,bj)*negone
                  end do
                end do
                do j = 1-oly, sny+oly
                  do i = 1, exchwidthx
                    advphi(snx+i,j,k,bi,bj) = advphi(snx+i,j,k,bi,bj)*
     $negone
                  end do
                end do
              endif
            end do
          end do
        end do
        call adexch_uv_3d_rl( advphi,aduphi, .false. ,mynz,mythid )
      else
        call exch1_rl_ad( advphi,olw,ole,ols,oln,mynz,exchwidthx,
     $exchwidthy,exch_update_corners,mythid )
        call exch1_rl_ad( aduphi,olw,ole,ols,oln,mynz,exchwidthx,
     $exchwidthy,exch_update_corners,mythid )
      endif

      end

      subroutine adexch_uv_xy_rs( aduphi, advphi, withsigns, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer exch_update_corners
      parameter ( exch_update_corners = 1 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

C==============================================
C declare arguments
C==============================================
      double precision aduphi(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision advphi(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer mythid
      logical withsigns

C==============================================
C declare local variables
C==============================================
      integer exchwidthx
      integer exchwidthy
      integer mynz
      integer ole
      integer oln
      integer ols
      integer olw

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      olw = olx
      ole = olx
      oln = oly
      ols = oly
      exchwidthx = olx
      exchwidthy = oly
      mynz = 1
      if (usecubedsphereexchange) then
        call exch1_rs_cube_ad( aduphi,advphi,withsigns,olw,ole,ols,oln,
     $mynz,exchwidthx,exchwidthy,exch_update_corners,mythid )
      else
        call exch1_rs_ad( advphi,olw,ole,ols,oln,mynz,exchwidthx,
     $exchwidthy,exch_update_corners,mythid )
        call exch1_rs_ad( aduphi,olw,ole,ols,oln,mynz,exchwidthx,
     $exchwidthy,exch_update_corners,mythid )
      endif

      end

      subroutine adexch_uv_xyz_rl( aduphi, advphi, withsigns, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer exch_update_corners
      parameter ( exch_update_corners = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

C==============================================
C declare arguments
C==============================================
      double precision aduphi(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advphi(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer mythid
      logical withsigns

C==============================================
C declare local variables
C==============================================
      integer exchwidthx
      integer exchwidthy
      integer mynz
      integer ole
      integer oln
      integer ols
      integer olw

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      olw = olx
      ole = olx
      oln = oly
      ols = oly
      exchwidthx = olx
      exchwidthy = oly
      mynz = nr
      if (usecubedsphereexchange) then
        call exch1_rl_cube_ad( aduphi,advphi,withsigns,olw,ole,ols,oln,
     $mynz,exchwidthx,exchwidthy,exch_update_corners,mythid )
      else
        call exch1_rl_ad( advphi,olw,ole,ols,oln,mynz,exchwidthx,
     $exchwidthy,exch_update_corners,mythid )
        call exch1_rl_ad( aduphi,olw,ole,ols,oln,mynz,exchwidthx,
     $exchwidthy,exch_update_corners,mythid )
      endif

      end

      subroutine adexch_xy_rl( adphi, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer exch_update_corners
      parameter ( exch_update_corners = 1 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

C==============================================
C declare arguments
C==============================================
      double precision adphi(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer mythid

C==============================================
C declare local variables
C==============================================
      integer exchwidthx
      integer exchwidthy
      integer mynz
      integer ole
      integer oln
      integer ols
      integer olw

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      olw = olx
      ole = olx
      oln = oly
      ols = oly
      exchwidthx = olx
      exchwidthy = oly
      mynz = 1
      if (usecubedsphereexchange) then
        call exch1_rl_cube_ad( adphi, .false. ,olw,ole,ols,oln,mynz,
     $exchwidthx,exchwidthy,exch_update_corners,mythid )
      else
        call exch1_rl_ad( adphi,olw,ole,ols,oln,mynz,exchwidthx,
     $exchwidthy,exch_update_corners,mythid )
      endif

      end

      subroutine adexch_xy_rs( adphi, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer exch_update_corners
      parameter ( exch_update_corners = 1 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

C==============================================
C declare arguments
C==============================================
      double precision adphi(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer mythid

C==============================================
C declare local variables
C==============================================
      integer exchwidthx
      integer exchwidthy
      integer mynz
      integer ole
      integer oln
      integer ols
      integer olw

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      olw = olx
      ole = olx
      oln = oly
      ols = oly
      exchwidthx = olx
      exchwidthy = oly
      mynz = 1
      if (usecubedsphereexchange) then
        call exch1_rs_cube_ad( adphi, .false. ,olw,ole,ols,oln,mynz,
     $exchwidthx,exchwidthy,exch_update_corners,mythid )
      else
        call exch1_rs_ad( adphi,olw,ole,ols,oln,mynz,exchwidthx,
     $exchwidthy,exch_update_corners,mythid )
      endif

      end

      subroutine adexch_xyz_rl( adphi, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer exch_update_corners
      parameter ( exch_update_corners = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

C==============================================
C declare arguments
C==============================================
      double precision adphi(1-olx:snx+olx,1-oly:sny+oly,1:nr,nsx,nsy)
      integer mythid

C==============================================
C declare local variables
C==============================================
      integer exchwidthx
      integer exchwidthy
      integer mynz
      integer ole
      integer oln
      integer ols
      integer olw

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      olw = olx
      ole = olx
      oln = oly
      ols = oly
      exchwidthx = olx
      exchwidthy = oly
      mynz = nr
      if (usecubedsphereexchange) then
        call exch1_rl_cube_ad( adphi, .false. ,olw,ole,ols,oln,mynz,
     $exchwidthx,exchwidthy,exch_update_corners,mythid )
      else
        call exch1_rl_ad( adphi,olw,ole,ols,oln,mynz,exchwidthx,
     $exchwidthy,exch_update_corners,mythid )
      endif

      end

      subroutine adexternal_fields_load( mytime, myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_len_fnam
      parameter ( max_len_fnam = 512 )
      integer max_len_prec
      parameter ( max_len_prec = 200 )
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adempmr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_empmr/ adempmr

      double precision adfu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_fu/ adfu

      double precision adfv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_fv/ adfv

      double precision adqnet(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_qnet/ adqnet

      double precision adsaltflux(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_saltflux/ adsaltflux

      double precision adsss(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_sss/ adsss

      double precision adsst(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_sst/ adsst

      double precision adempmr0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adempmr1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adqnet0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adqnet1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsaltflux0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsaltflux1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsss0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsss1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsst0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsst1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtaux0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtaux1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtauy0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtauy1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adtdfields/ adtaux0, adtauy0, adqnet0, adempmr0, adsst0, 
     $adsss0, adtaux1, adtauy1, adqnet1, adempmr1, adsst1, adsss1, 
     $adsaltflux0, adsaltflux1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      character*(max_len_fnam) bathyfile
      character*(max_len_fnam) buoyancyrelation
      character*(max_len_fnam) delrcfile
      character*(max_len_fnam) delrfile
      character*(max_len_fnam) delxfile
      character*(max_len_fnam) delyfile
      character*(max_len_fnam) diffkrfile
      character*(max_len_fnam) dqdtfile
      character*(max_len_fnam) eddypsixfile
      character*(max_len_fnam) eddypsiyfile
      character*(max_len_fnam) empmrfile
      character*(6) eostype
      character*(max_len_fnam) horizgridfile
      character*(max_len_fnam) hybsigmfile
      character*(max_len_fnam) hydrogsaltfile
      character*(max_len_fnam) hydrogthetafile
      character*(max_len_fnam) lambdasaltfile
      character*(max_len_fnam) lambdathetafile
      character*(max_len_fnam) mdsiolocaldir
      character*(max_len_fnam) meridwindfile
      character*(10) pickupsuff
      character*(max_len_fnam) ploadfile
      character*(max_len_fnam) psurfinitfile
      character*(max_len_fnam) rhoreffile
      character*(max_len_fnam) saltclimfile
      character*(max_len_fnam) saltfluxfile
      character*(max_len_fnam) sreffile
      character*(max_len_fnam) surfqfile
      character*(max_len_fnam) surfqnetfile
      character*(max_len_fnam) surfqswfile
      character*(max_len_prec/2) the_run_name
      character*(max_len_fnam) thetaclimfile
      character*(max_len_fnam) topofile
      character*(max_len_fnam) treffile
      character*(max_len_fnam) uvelinitfile
      character*(max_len_fnam) visca4dfile
      character*(max_len_fnam) visca4zfile
      character*(max_len_fnam) viscahdfile
      character*(max_len_fnam) viscahzfile
      character*(max_len_fnam) vvelinitfile
      character*(max_len_fnam) zonalwindfile
      common /parm_c/ buoyancyrelation, eostype, pickupsuff, 
     $mdsiolocaldir, treffile, sreffile, rhoreffile, delrfile, 
     $delrcfile, hybsigmfile, delxfile, delyfile, horizgridfile, 
     $bathyfile, topofile, viscahdfile, viscahzfile, visca4dfile, 
     $visca4zfile, hydrogthetafile, hydrogsaltfile, diffkrfile, 
     $zonalwindfile, meridwindfile, thetaclimfile, saltclimfile, 
     $empmrfile, saltfluxfile, surfqfile, surfqnetfile, surfqswfile, 
     $lambdathetafile, lambdasaltfile, uvelinitfile, vvelinitfile, 
     $psurfinitfile, dqdtfile, ploadfile, eddypsixfile, eddypsiyfile, 
     $the_run_name

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      integer myiter
      integer mythid
      double precision mytime

C==============================================
C declare local variables
C==============================================
      double precision awght
      integer bi
      integer bj
      double precision bwght
      integer i
      integer ifcyc
      integer ifprd
      integer iftm
      integer imytm
      integer intime0
      integer j
      double precision rdt
      double precision tmp1wght
      double precision tmp2wght

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (periodicexternalforcing) then
        rdt = 1.d0/deltatclock
        imytm = nint(mytime*rdt)
        ifprd = nint(externforcingperiod*rdt)
        ifcyc = nint(externforcingcycle*rdt)
        imytm = imytm+ifcyc*(1-nint(mytime/externforcingcycle))
        iftm = mod(imytm+ifcyc-ifprd/2,ifcyc)
        intime0 = 1+int(iftm/ifprd)
        tmp1wght = float(iftm-ifprd*(intime0-1))
        tmp2wght = float(ifprd)
        awght = tmp1wght/tmp2wght
        bwght = 1.d0-awght
        do bj = mybylo(mythid), mybyhi(mythid)
          do bi = mybxlo(mythid), mybxhi(mythid)
            if (saltfluxfile .ne. ' ') then
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  adsaltflux0(i,j,bi,bj) = adsaltflux0(i,j,bi,bj)+
     $adsaltflux(i,j,bi,bj)*bwght
                  adsaltflux1(i,j,bi,bj) = adsaltflux1(i,j,bi,bj)+
     $adsaltflux(i,j,bi,bj)*awght
                  adsaltflux(i,j,bi,bj) = 0.d0
                end do
              end do
            endif
            if (empmrfile .ne. ' ') then
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  adempmr0(i,j,bi,bj) = adempmr0(i,j,bi,bj)+adempmr(i,j,
     $bi,bj)*bwght
                  adempmr1(i,j,bi,bj) = adempmr1(i,j,bi,bj)+adempmr(i,j,
     $bi,bj)*awght
                  adempmr(i,j,bi,bj) = 0.d0
                end do
              end do
            endif
            if (surfqnetfile .ne. ' ' .or. surfqfile .ne. ' ') then
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  adqnet0(i,j,bi,bj) = adqnet0(i,j,bi,bj)+adqnet(i,j,bi,
     $bj)*bwght
                  adqnet1(i,j,bi,bj) = adqnet1(i,j,bi,bj)+adqnet(i,j,bi,
     $bj)*awght
                  adqnet(i,j,bi,bj) = 0.d0
                end do
              end do
            endif
            if (meridwindfile .ne. ' ') then
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  adtauy0(i,j,bi,bj) = adtauy0(i,j,bi,bj)+adfv(i,j,bi,
     $bj)*bwght
                  adtauy1(i,j,bi,bj) = adtauy1(i,j,bi,bj)+adfv(i,j,bi,
     $bj)*awght
                  adfv(i,j,bi,bj) = 0.d0
                end do
              end do
            endif
            if (zonalwindfile .ne. ' ') then
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  adtaux0(i,j,bi,bj) = adtaux0(i,j,bi,bj)+adfu(i,j,bi,
     $bj)*bwght
                  adtaux1(i,j,bi,bj) = adtaux1(i,j,bi,bj)+adfu(i,j,bi,
     $bj)*awght
                  adfu(i,j,bi,bj) = 0.d0
                end do
              end do
            endif
            if (saltclimfile .ne. ' ') then
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  adsss0(i,j,bi,bj) = adsss0(i,j,bi,bj)+adsss(i,j,bi,bj)
     $*bwght
                  adsss1(i,j,bi,bj) = adsss1(i,j,bi,bj)+adsss(i,j,bi,bj)
     $*awght
                  adsss(i,j,bi,bj) = 0.d0
                end do
              end do
            endif
            if (thetaclimfile .ne. ' ') then
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  adsst0(i,j,bi,bj) = adsst0(i,j,bi,bj)+adsst(i,j,bi,bj)
     $*bwght
                  adsst1(i,j,bi,bj) = adsst1(i,j,bi,bj)+adsst(i,j,bi,bj)
     $*awght
                  adsst(i,j,bi,bj) = 0.d0
                end do
              end do
            endif
          end do
        end do
        if (iftm-ifprd*(intime0-1) .eq. 0 .or. myiter .eq. niter0) then
          call adexch_xy_rs( adsaltflux1,mythid )
          call adexch_xy_rs( adsaltflux0,mythid )
          call adexch_xy_rs( adempmr1,mythid )
          call adexch_xy_rs( adempmr0,mythid )
          call adexch_xy_rs( adqnet1,mythid )
          call adexch_xy_rs( adqnet0,mythid )
          call adexch_uv_xy_rs( adtaux1,adtauy1, .true. ,mythid )
          call adexch_uv_xy_rs( adtaux0,adtauy0, .true. ,mythid )
          call adexch_xy_rs( adsss1,mythid )
          call adexch_xy_rs( adsss0,mythid )
          call adexch_xy_rs( adsst1,mythid )
          call adexch_xy_rs( adsst0,mythid )
          if (empmrfile .ne. ' ') then
            do bj = mybylo(mythid), mybyhi(mythid)
              do bi = mybxlo(mythid), mybxhi(mythid)
                do j = 1-oly, sny+oly
                  do i = 1-olx, snx+olx
                    adempmr1(i,j,bi,bj) = adempmr1(i,j,bi,bj)*
     $rhoconstfresh
                    adempmr0(i,j,bi,bj) = adempmr0(i,j,bi,bj)*
     $rhoconstfresh
                  end do
                end do
              end do
            end do
            call adread_rec_xy_rs( adempmr1 )
            call adread_rec_xy_rs( adempmr0 )
          endif
        endif
      endif

      end

      subroutine adexternal_forcing_s( bi, bj, klev )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision adssurfcor
      double precision adtsurfcor
      common /adsurf_correc/ adtsurfcor, adssurfcor

      double precision adsurfaceforcings(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingt(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingtice(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingu(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingv(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      common /adsurface_forcing/ adsurfaceforcingu, adsurfaceforcingv, 
     $adsurfaceforcingt, adsurfaceforcings, adsurfaceforcingtice

      integer klowc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_i/ ksurfc, ksurfw, ksurfs, klowc

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

C==============================================
C declare arguments
C==============================================
      integer bi
      integer bj
      integer klev

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      integer ksurface

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (fluidisair) then
        ksurface = 0
      else if (usingpcoords) then
        ksurface = nr
      else
        ksurface = 1
      endif
      if (linfsconservetr) then
        do j = 1, sny
          do i = 1, snx
            if (klev .eq. ksurfc(i,j,bi,bj)) then
              adssurfcor = adssurfcor+adgs(i,j,klev,bi,bj)*recip_drf(
     $klev)*recip_hfacc(i,j,klev,bi,bj)
            endif
          end do
        end do
      endif
      if (klev .eq. ksurface) then
        do j = 1, sny
          do i = 1, snx
            adsurfaceforcings(i,j,bi,bj) = adsurfaceforcings(i,j,bi,bj)+
     $adgs(i,j,klev,bi,bj)*recip_drf(klev)*recip_hfacc(i,j,klev,bi,bj)
          end do
        end do
      endif

      end

      subroutine adexternal_forcing_surf( bi, bj, imin, imax, jmin, 
     $jmax )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision unset_rl
      parameter ( unset_rl = 123456.7d0 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision addetahdt(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adpmepr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adexact_eta_local/ addetahdt, adpmepr

      double precision adempmr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_empmr/ adempmr

      double precision adfu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_fu/ adfu

      double precision adfv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_fv/ adfv

      double precision adqnet(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_qnet/ adqnet

      double precision adsaltflux(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_saltflux/ adsaltflux

      double precision adsss(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_sss/ adsss

      double precision adsst(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_sst/ adsst

      double precision adqnetm(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /admean_qnet/ adqnetm

      double precision adsurfaceforcings(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingt(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingtice(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingu(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingv(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      common /adsurface_forcing/ adsurfaceforcingu, adsurfaceforcingv, 
     $adsurfaceforcingt, adsurfaceforcings, adsurfaceforcingtice

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      double precision detahdt(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision etahnm1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision pmepr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /exact_eta_local/ etahnm1, detahdt, pmepr

      double precision empmr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ffields_empmr/ empmr

      double precision lambdasaltclimrelax(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      common /ffields_lambdasaltclimrelax/ lambdasaltclimrelax

      double precision lambdathetaclimrelax(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      common /ffields_lambdathetaclimrelax/ lambdathetaclimrelax

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision heatcapacity_cp
      double precision recip_cp
      common /parm_a/ heatcapacity_cp, recip_cp

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      integer ks

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (usingpcoords) then
        ks = nr
      else
        ks = 1
      endif
      if (userealfreshwaterflux) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            empmr(i,j,bi,bj) = empmr(i,j,bi,bj)*maskinc(i,j,bi,bj)
          end do
        end do
      endif
      if (staggertimestep) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            pmepr(i,j,bi,bj) = -empmr(i,j,bi,bj)
          end do
        end do
      endif
      if ((nonlinfreesurf .gt. 0 .or. usingpcoords) .and. 
     $userealfreshwaterflux) then
        if (salt_evprrn .ne. unset_rl) then
          do j = jmin, jmax
            do i = imin, imax
              adpmepr(i,j,bi,bj) = adpmepr(i,j,bi,bj)+adsurfaceforcings(
     $i,j,bi,bj)*(salt_evprrn-salt(i,j,ks,bi,bj))*mass2runit
              adsalt(i,j,ks,bi,bj) = adsalt(i,j,ks,bi,bj)-
     $adsurfaceforcings(i,j,bi,bj)*pmepr(i,j,bi,bj)*mass2runit
            end do
          end do
        endif
        if (temp_evprrn .ne. unset_rl) then
          do j = jmin, jmax
            do i = imin, imax
              adpmepr(i,j,bi,bj) = adpmepr(i,j,bi,bj)+adsurfaceforcingt(
     $i,j,bi,bj)*(temp_evprrn-theta(i,j,ks,bi,bj))*mass2runit
              adtheta(i,j,ks,bi,bj) = adtheta(i,j,ks,bi,bj)-
     $adsurfaceforcingt(i,j,bi,bj)*pmepr(i,j,bi,bj)*mass2runit
            end do
          end do
        endif
      else
        if (convertfw2salt .eq. (-1.)) then
          if (salt_evprrn .ne. unset_rl) then
            do j = jmin, jmax
              do i = imin, imax
                adempmr(i,j,bi,bj) = adempmr(i,j,bi,bj)+
     $adsurfaceforcings(i,j,bi,bj)*(salt(i,j,ks,bi,bj)-salt_evprrn)*
     $mass2runit
                adsalt(i,j,ks,bi,bj) = adsalt(i,j,ks,bi,bj)+
     $adsurfaceforcings(i,j,bi,bj)*empmr(i,j,bi,bj)*mass2runit
              end do
            end do
          endif
          if (temp_evprrn .ne. unset_rl) then
            do j = jmin, jmax
              do i = imin, imax
                adempmr(i,j,bi,bj) = adempmr(i,j,bi,bj)+
     $adsurfaceforcingt(i,j,bi,bj)*(theta(i,j,ks,bi,bj)-temp_evprrn)*
     $mass2runit
                adtheta(i,j,ks,bi,bj) = adtheta(i,j,ks,bi,bj)+
     $adsurfaceforcingt(i,j,bi,bj)*empmr(i,j,bi,bj)*mass2runit
              end do
            end do
          endif
        else
          if (salt_evprrn .ne. unset_rl) then
            do j = jmin, jmax
              do i = imin, imax
                adempmr(i,j,bi,bj) = adempmr(i,j,bi,bj)+
     $adsurfaceforcings(i,j,bi,bj)*(convertfw2salt-salt_evprrn)*
     $mass2runit
              end do
            end do
          endif
          if (temp_evprrn .ne. unset_rl) then
            do j = jmin, jmax
              do i = imin, imax
                adempmr(i,j,bi,bj) = adempmr(i,j,bi,bj)+
     $adsurfaceforcingt(i,j,bi,bj)*(tref(ks)-temp_evprrn)*mass2runit
              end do
            end do
          endif
        endif
      endif
      if (staggertimestep) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adempmr(i,j,bi,bj) = adempmr(i,j,bi,bj)-adpmepr(i,j,bi,bj)
            adpmepr(i,j,bi,bj) = 0.d0
          end do
        end do
      endif
      if (userealfreshwaterflux) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adempmr(i,j,bi,bj) = adempmr(i,j,bi,bj)*maskinc(i,j,bi,bj)
          end do
        end do
      endif
      do j = jmin, jmax
        do i = imin, imax
          adsaltflux(i,j,bi,bj) = adsaltflux(i,j,bi,bj)-
     $adsurfaceforcings(i,j,bi,bj)*mass2runit
          adqnet(i,j,bi,bj) = adqnet(i,j,bi,bj)-adsurfaceforcingt(i,j,
     $bi,bj)*recip_cp*mass2runit
          adqnetm(i,j,bi,bj) = adqnetm(i,j,bi,bj)-adsurfaceforcingt(i,j,
     $bi,bj)*recip_cp*mass2runit
          adfv(i,j,bi,bj) = adfv(i,j,bi,bj)+adsurfaceforcingv(i,j,bi,bj)
     $*mass2runit
          adsurfaceforcingv(i,j,bi,bj) = 0.d0
          adfu(i,j,bi,bj) = adfu(i,j,bi,bj)+adsurfaceforcingu(i,j,bi,bj)
     $*mass2runit
          adsurfaceforcingu(i,j,bi,bj) = 0.d0
        end do
      end do
      if (dothetaclimrelax .or. dosaltclimrelax) then
        do j = jmin, jmax
          do i = imin, imax
            adsalt(i,j,ks,bi,bj) = adsalt(i,j,ks,bi,bj)-
     $adsurfaceforcings(i,j,bi,bj)*lambdasaltclimrelax(i,j,bi,bj)*drf(
     $ks)*hfacc(i,j,ks,bi,bj)
            adsss(i,j,bi,bj) = adsss(i,j,bi,bj)+adsurfaceforcings(i,j,
     $bi,bj)*lambdasaltclimrelax(i,j,bi,bj)*drf(ks)*hfacc(i,j,ks,bi,bj)
            adsurfaceforcings(i,j,bi,bj) = 0.d0
            adsst(i,j,bi,bj) = adsst(i,j,bi,bj)+adsurfaceforcingt(i,j,
     $bi,bj)*lambdathetaclimrelax(i,j,bi,bj)*drf(ks)*hfacc(i,j,ks,bi,bj)
            adtheta(i,j,ks,bi,bj) = adtheta(i,j,ks,bi,bj)-
     $adsurfaceforcingt(i,j,bi,bj)*lambdathetaclimrelax(i,j,bi,bj)*drf(
     $ks)*hfacc(i,j,ks,bi,bj)
            adsurfaceforcingt(i,j,bi,bj) = 0.d0
          end do
        end do
      else
        do j = jmin, jmax
          do i = imin, imax
            adsurfaceforcings(i,j,bi,bj) = 0.d0
            adsurfaceforcingt(i,j,bi,bj) = 0.d0
          end do
        end do
      endif

      end

      subroutine adexternal_forcing_t( bi, bj, klev )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision adssurfcor
      double precision adtsurfcor
      common /adsurf_correc/ adtsurfcor, adssurfcor

      double precision adsurfaceforcings(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingt(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingtice(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingu(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingv(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      common /adsurface_forcing/ adsurfaceforcingu, adsurfaceforcingv, 
     $adsurfaceforcingt, adsurfaceforcings, adsurfaceforcingtice

      integer klowc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_i/ ksurfc, ksurfw, ksurfs, klowc

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

C==============================================
C declare arguments
C==============================================
      integer bi
      integer bj
      integer klev

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      integer ksurface

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (fluidisair) then
        ksurface = 0
      else if (usingpcoords) then
        ksurface = nr
      else
        ksurface = 1
      endif
      if (linfsconservetr) then
        do j = 1, sny
          do i = 1, snx
            if (klev .eq. ksurfc(i,j,bi,bj)) then
              adtsurfcor = adtsurfcor+adgt(i,j,klev,bi,bj)*recip_drf(
     $klev)*recip_hfacc(i,j,klev,bi,bj)
            endif
          end do
        end do
      endif
      if (klev .eq. ksurface) then
        do j = 1, sny
          do i = 1, snx
            adsurfaceforcingt(i,j,bi,bj) = adsurfaceforcingt(i,j,bi,bj)+
     $adgt(i,j,klev,bi,bj)*recip_drf(klev)*recip_hfacc(i,j,klev,bi,bj)
          end do
        end do
      endif

      end

      subroutine adexternal_forcing_u( bi, bj, klev )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision adsurfaceforcings(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingt(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingtice(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingu(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingv(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      common /adsurface_forcing/ adsurfaceforcingu, adsurfaceforcingv, 
     $adsurfaceforcingt, adsurfaceforcings, adsurfaceforcingtice

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      integer bi
      integer bj
      integer klev

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      integer ksurface

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (fluidisair) then
        ksurface = 0
      else if (usingpcoords) then
        ksurface = nr
      else
        ksurface = 1
      endif
      if (klev .eq. ksurface) then
        do j = 0, sny+1
          do i = 1, snx+1
            adsurfaceforcingu(i,j,bi,bj) = adsurfaceforcingu(i,j,bi,bj)+
     $adgu(i,j,klev,bi,bj)*fofacmom*recip_drf(klev)*recip_hfacw(i,j,
     $klev,bi,bj)
          end do
        end do
      endif

      end

      subroutine adexternal_forcing_v( bi, bj, klev )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision adsurfaceforcings(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingt(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingtice(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingu(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingv(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      common /adsurface_forcing/ adsurfaceforcingu, adsurfaceforcingv, 
     $adsurfaceforcingt, adsurfaceforcings, adsurfaceforcingtice

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      integer bi
      integer bj
      integer klev

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      integer ksurface

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (fluidisair) then
        ksurface = 0
      else if (usingpcoords) then
        ksurface = nr
      else
        ksurface = 1
      endif
      if (klev .eq. ksurface) then
        do j = 1, sny+1
          do i = 0, snx+1
            adsurfaceforcingv(i,j,bi,bj) = adsurfaceforcingv(i,j,bi,bj)+
     $adgv(i,j,klev,bi,bj)*fofacmom*recip_drf(klev)*recip_hfacs(i,j,
     $klev,bi,bj)
          end do
        end do
      endif

      end

      subroutine adfill_cs_corner_tr_rl( fill4dir, withsigns, adtrfld )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

C==============================================
C declare arguments
C==============================================
      double precision adtrfld(1-olx:snx+olx,1-oly:sny+oly)
      integer fill4dir
      logical withsigns

C==============================================
C declare local variables
C==============================================
      double precision adtrfldh
      double precision adtrfldi
      double precision adtrfldj
      double precision adtrfldk
      double precision adtrfldl
      double precision adtrfldm
      double precision adtrfldn
      double precision adtrfldo
      integer i
      integer j
      double precision negone
      logical northeastcorner
      logical northwestcorner
      logical southeastcorner
      logical southwestcorner

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      negone = 1.
      if (withsigns) then
        negone = -1.
      endif
      if (usecubedsphereexchange) then
        southwestcorner =  .true. 
        southeastcorner =  .true. 
        northwestcorner =  .true. 
        northeastcorner =  .true. 
        if (fill4dir .eq. 0) then
          if (northeastcorner) then
            do j = 1, oly
              do i = 1, olx
                adtrfld(snx+i,sny+j) = 0.d0
              end do
            end do
          endif
          if (northwestcorner) then
            do j = 1, oly
              do i = 1, olx
                adtrfld(1-i,sny+j) = 0.d0
              end do
            end do
          endif
          if (southeastcorner) then
            do j = 1, oly
              do i = 1, olx
                adtrfld(snx+i,1-j) = 0.d0
              end do
            end do
          endif
          if (southwestcorner) then
            do j = 1, oly
              do i = 1, olx
                adtrfld(1-i,1-j) = 0.d0
              end do
            end do
          endif
        else if (fill4dir .eq. 1) then
          if (northeastcorner) then
            do j = 1, oly
              do i = olx, 1, -1
                adtrfldl = adtrfld(snx+i,sny+j)
                adtrfld(snx+i,sny+j) = 0.d0
                adtrfld(snx+j,sny+1-i) = adtrfld(snx+j,sny+1-i)+
     $adtrfldl*negone
              end do
            end do
          endif
          if (northwestcorner) then
            do j = 1, oly
              do i = olx, 1, -1
                adtrfldm = adtrfld(1-i,sny+j)
                adtrfld(1-i,sny+j) = 0.d0
                adtrfld(1-j,sny+1-i) = adtrfld(1-j,sny+1-i)+adtrfldm*
     $negone
              end do
            end do
          endif
          if (southeastcorner) then
            do j = 1, oly
              do i = olx, 1, -1
                adtrfldn = adtrfld(snx+i,1-j)
                adtrfld(snx+i,1-j) = 0.d0
                adtrfld(snx+j,i) = adtrfld(snx+j,i)+adtrfldn*negone
              end do
            end do
          endif
          if (southwestcorner) then
            do j = 1, oly
              do i = olx, 1, -1
                adtrfldo = adtrfld(1-i,1-j)
                adtrfld(1-i,1-j) = 0.d0
                adtrfld(1-j,i) = adtrfld(1-j,i)+adtrfldo*negone
              end do
            end do
          endif
        else if (fill4dir .eq. 2) then
          if (northeastcorner) then
            do j = 1, oly
              do i = olx, 1, -1
                adtrfldh = adtrfld(snx+i,sny+j)
                adtrfld(snx+i,sny+j) = 0.d0
                adtrfld(snx+1-j,sny+i) = adtrfld(snx+1-j,sny+i)+
     $adtrfldh*negone
              end do
            end do
          endif
          if (northwestcorner) then
            do j = 1, oly
              do i = olx, 1, -1
                adtrfldi = adtrfld(1-i,sny+j)
                adtrfld(1-i,sny+j) = 0.d0
                adtrfld(j,sny+i) = adtrfld(j,sny+i)+adtrfldi*negone
              end do
            end do
          endif
          if (southeastcorner) then
            do j = 1, oly
              do i = olx, 1, -1
                adtrfldj = adtrfld(snx+i,1-j)
                adtrfld(snx+i,1-j) = 0.d0
                adtrfld(snx+1-j,1-i) = adtrfld(snx+1-j,1-i)+adtrfldj*
     $negone
              end do
            end do
          endif
          if (southwestcorner) then
            do j = 1, oly
              do i = olx, 1, -1
                adtrfldk = adtrfld(1-i,1-j)
                adtrfld(1-i,1-j) = 0.d0
                adtrfld(j,1-i) = adtrfld(j,1-i)+adtrfldk*negone
              end do
            end do
          endif
        endif
      endif

      end

      subroutine adfind_bulkmod( imin, imax, jmin, jmax, locpres, 
     $adlocpres, tfld, adtfld, sfld, adsfld, adbulkmod )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision sitobar
      parameter ( sitobar = 0.00001d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision eosjmdcfw(6)
      double precision eosjmdckfw(5)
      double precision eosjmdckp(14)
      double precision eosjmdcksw(7)
      double precision eosjmdcsw(9)
      common /parm_eos_jmd95/ eosjmdcfw, eosjmdcsw, eosjmdckfw, 
     $eosjmdcksw, eosjmdckp

C==============================================
C declare arguments
C==============================================
      double precision adbulkmod(1-olx:snx+olx,1-oly:sny+oly)
      double precision adlocpres(1-olx:snx+olx,1-oly:sny+oly)
      double precision adsfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtfld(1-olx:snx+olx,1-oly:sny+oly)
      integer imax
      integer imin
      integer jmax
      integer jmin
      double precision locpres(1-olx:snx+olx,1-oly:sny+oly)
      double precision sfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision tfld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adbmfresh
      double precision adbmpres
      double precision adbmsalt
      double precision adp
      double precision adp2
      double precision ads
      double precision ads3o2
      double precision adt
      double precision adt2
      double precision adt3
      double precision adt4
      integer i
      integer j
      double precision p
      double precision p2
      double precision s
      double precision s3o2
      double precision t
      double precision t2
      double precision t3

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adbmfresh = 0.d0
      adbmpres = 0.d0
      adbmsalt = 0.d0
      adp = 0.d0
      adp2 = 0.d0
      ads = 0.d0
      ads3o2 = 0.d0
      adt = 0.d0
      adt2 = 0.d0
      adt3 = 0.d0
      adt4 = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = jmax, jmin, -1
        do i = imax, imin, -1
          t = tfld(i,j)
          t2 = t*t
          t3 = t2*t
          s = sfld(i,j)
          if (s .gt. 0.d0) then
            s3o2 = s*sqrt(s)
          else
            s = 0.d0
            s3o2 = 0.d0
          endif
          p = locpres(i,j)*sitobar
          p2 = p*p
          adbmfresh = adbmfresh+adbulkmod(i,j)
          adbmpres = adbmpres+adbulkmod(i,j)
          adbmsalt = adbmsalt+adbulkmod(i,j)
          adbulkmod(i,j) = 0.d0
          adp = adp+adbmpres*(eosjmdckp(1)+eosjmdckp(2)*t+eosjmdckp(3)*
     $t2+eosjmdckp(4)*t3+s*(eosjmdckp(5)+eosjmdckp(6)*t+eosjmdckp(7)*t2)
     $+s3o2*eosjmdckp(8))
          adp2 = adp2+adbmpres*(eosjmdckp(9)+eosjmdckp(10)*t+eosjmdckp(
     $11)*t2+s*(eosjmdckp(12)+eosjmdckp(13)*t+eosjmdckp(14)*t2))
          ads = ads+adbmpres*(p*(eosjmdckp(5)+eosjmdckp(6)*t+eosjmdckp(
     $7)*t2)+p2*(eosjmdckp(12)+eosjmdckp(13)*t+eosjmdckp(14)*t2))
          ads3o2 = ads3o2+adbmpres*p*eosjmdckp(8)
          adt = adt+adbmpres*(p*(eosjmdckp(2)+s*eosjmdckp(6))+p2*(
     $eosjmdckp(10)+s*eosjmdckp(13)))
          adt2 = adt2+adbmpres*(p*(eosjmdckp(3)+s*eosjmdckp(7))+p2*(
     $eosjmdckp(11)+s*eosjmdckp(14)))
          adt3 = adt3+adbmpres*p*eosjmdckp(4)
          adbmpres = 0.d0
          ads = ads+adbmsalt*(eosjmdcksw(1)+eosjmdcksw(2)*t+eosjmdcksw(
     $3)*t2+eosjmdcksw(4)*t3)
          ads3o2 = ads3o2+adbmsalt*(eosjmdcksw(5)+eosjmdcksw(6)*t+
     $eosjmdcksw(7)*t2)
          adt = adt+adbmsalt*(s*eosjmdcksw(2)+s3o2*eosjmdcksw(6))
          adt2 = adt2+adbmsalt*(s*eosjmdcksw(3)+s3o2*eosjmdcksw(7))
          adt3 = adt3+adbmsalt*s*eosjmdcksw(4)
          adbmsalt = 0.d0
          adt = adt+adbmfresh*eosjmdckfw(2)
          adt2 = adt2+adbmfresh*eosjmdckfw(3)
          adt3 = adt3+adbmfresh*eosjmdckfw(4)
          adt4 = adt4+adbmfresh*eosjmdckfw(5)
          adbmfresh = 0.d0
          adp = adp+2*adp2*p
          adp2 = 0.d0
          adlocpres(i,j) = adlocpres(i,j)+adp*sitobar
          adp = 0.d0
          s = sfld(i,j)
          if (s .gt. 0.d0) then
            ads = ads+ads3o2*(s*(1./(2.*sqrt(s)))+sqrt(s))
            ads3o2 = 0.d0
          else
            ads3o2 = 0.d0
            ads = 0.d0
          endif
          adsfld(i,j) = adsfld(i,j)+ads
          ads = 0.d0
          adt = adt+adt4*t3
          adt3 = adt3+adt4*t
          adt4 = 0.d0
          adt = adt+adt3*t2
          adt2 = adt2+adt3*t
          adt3 = 0.d0
          adt = adt+2*adt2*t
          adt2 = 0.d0
          adtfld(i,j) = adtfld(i,j)+adt
          adt = 0.d0
        end do
      end do

      end

      subroutine adfind_rho_2d( imin, imax, jmin, jmax, kref, tfld, 
     $adtfld, sfld, adsfld, adrholoc, bi, bj )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision sitobar
      parameter ( sitobar = 0.00001d0 )

C==============================================
C declare common blocks
C==============================================
      character*(6) equationofstate
      double precision sbeta
      double precision talpha
      common /parm_eos_lin/ talpha, sbeta, equationofstate

      double precision eosc(9,nr+1)
      double precision eosrefs(nr+1)
      double precision eosreft(nr+1)
      double precision eossig0(nr+1)
      common /parm_eos_nl/ eosc, eossig0, eosreft, eosrefs

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adrholoc(1-olx:snx+olx,1-oly:sny+oly)
      double precision adsfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtfld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer kref
      double precision sfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision tfld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adbulkmod(1-olx:snx+olx,1-oly:sny+oly)
      double precision addeltasig
      double precision adlocpres(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrhoden(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrhonum(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrhop0(1-olx:snx+olx,1-oly:sny+oly)
      double precision adsp
      double precision adtp
      double precision bulkmod(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer ip1
      integer ip2
      integer j
      double precision locpres(1-olx:snx+olx,1-oly:sny+oly)
      integer mythid
      double precision refsalt
      double precision reftemp
      double precision rhoden(1-olx:snx+olx,1-oly:sny+oly)
      double precision rhonum(1-olx:snx+olx,1-oly:sny+oly)
      double precision rhop0(1-olx:snx+olx,1-oly:sny+oly)
      double precision sp
      double precision tp

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adbulkmod(ip1,ip2) = 0.d0
        end do
      end do
      addeltasig = 0.d0
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adlocpres(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adrhoden(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adrhonum(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adrhop0(ip1,ip2) = 0.d0
        end do
      end do
      adsp = 0.d0
      adtp = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (equationofstate .eq. 'LINEAR') then
        do j = jmin, jmax
          do i = imin, imax
            adsfld(i,j) = adsfld(i,j)+adrholoc(i,j)*rhonil*sbeta
            adtfld(i,j) = adtfld(i,j)-adrholoc(i,j)*rhonil*talpha
            adrholoc(i,j) = 0.d0
          end do
        end do
      else if (equationofstate .eq. 'POLY3') then
        reftemp = eosreft(kref)
        refsalt = eosrefs(kref)
        do j = jmax, jmin, -1
          addeltasig = 0.d0
          adsp = 0.d0
          adtp = 0.d0
          do i = imax, imin, -1
            addeltasig = 0.d0
            adsp = 0.d0
            adtp = 0.d0
            tp = tfld(i,j)-reftemp
            sp = sfld(i,j)-refsalt
            addeltasig = addeltasig+adrholoc(i,j)
            adrholoc(i,j) = 0.d0
            adsp = adsp+addeltasig*((eosc(9,kref)*sp+eosc(5,kref))*sp+
     $eosc(2,kref)+(eosc(9,kref)*sp+eosc(5,kref)+eosc(9,kref)*sp)*sp+(
     $eosc(7,kref)*tp+eosc(8,kref)*sp+eosc(4,kref)+eosc(8,kref)*sp)*tp)
            adtp = adtp+addeltasig*((eosc(6,kref)*tp+eosc(7,kref)*sp+
     $eosc(3,kref))*tp+(eosc(8,kref)*sp+eosc(4,kref))*sp+eosc(1,kref)+(
     $eosc(6,kref)*tp+eosc(7,kref)*sp+eosc(3,kref)+eosc(6,kref)*tp)*tp)
            addeltasig = 0.d0
            adsfld(i,j) = adsfld(i,j)+adsp
            adsp = 0.d0
            adtfld(i,j) = adtfld(i,j)+adtp
            adtp = 0.d0
          end do
        end do
      else if (equationofstate(1:5) .eq. 'JMD95' .or. equationofstate 
     $.eq. 'UNESCO') then
        call pressure_for_eos( bi,bj,imin,imax,jmin,jmax,kref,locpres,
     $mythid )
        call find_rhop0( imin,imax,jmin,jmax,tfld,sfld,rhop0,mythid )
        call find_bulkmod( imin,imax,jmin,jmax,locpres,tfld,sfld,
     $bulkmod,mythid )
        do j = jmin, jmax
          do i = imin, imax
            adbulkmod(i,j) = adbulkmod(i,j)-adrholoc(i,j)*(rhop0(i,j)*(
     $locpres(i,j)*sitobar/(bulkmod(i,j)*bulkmod(i,j)))/((1.d0-locpres(
     $i,j)*sitobar/bulkmod(i,j))*(1.d0-locpres(i,j)*sitobar/bulkmod(i,j)
     $)))
            adlocpres(i,j) = adlocpres(i,j)+adrholoc(i,j)*(rhop0(i,j)*(
     $sitobar/bulkmod(i,j))/((1.d0-locpres(i,j)*sitobar/bulkmod(i,j))*(
     $1.d0-locpres(i,j)*sitobar/bulkmod(i,j))))
            adrhop0(i,j) = adrhop0(i,j)+adrholoc(i,j)/(1.d0-locpres(i,j)
     $*sitobar/bulkmod(i,j))
            adrholoc(i,j) = 0.d0
          end do
        end do
        call adfind_bulkmod( imin,imax,jmin,jmax,locpres,adlocpres,tfld,
     $adtfld,sfld,adsfld,adbulkmod )
        call adfind_rhop0( imin,imax,jmin,jmax,tfld,adtfld,sfld,adsfld,
     $adrhop0 )
        call adpressure_for_eos( bi,bj,kref,adlocpres )
      else if (equationofstate .eq. 'MDJWF') then
        call pressure_for_eos( bi,bj,imin,imax,jmin,jmax,kref,locpres,
     $mythid )
        call find_rhonum( imin,imax,jmin,jmax,locpres,tfld,sfld,rhonum,
     $mythid )
        call find_rhoden( imin,imax,jmin,jmax,locpres,tfld,sfld,rhoden,
     $mythid )
        do j = jmin, jmax
          do i = imin, imax
            adrhoden(i,j) = adrhoden(i,j)+adrholoc(i,j)*rhonum(i,j)
            adrhonum(i,j) = adrhonum(i,j)+adrholoc(i,j)*rhoden(i,j)
            adrholoc(i,j) = 0.d0
          end do
        end do
        call adfind_rhoden( imin,imax,jmin,jmax,locpres,adlocpres,tfld,
     $adtfld,sfld,adsfld,adrhoden )
        call adfind_rhonum( imin,imax,jmin,jmax,locpres,adlocpres,tfld,
     $adtfld,sfld,adsfld,adrhonum )
        call adpressure_for_eos( bi,bj,kref,adlocpres )
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          adrholoc(i,j) = 0.d0
        end do
      end do

      end

      subroutine adfind_rhoden( imin, imax, jmin, jmax, locpres, 
     $adlocpres, tfld, adtfld, sfld, adsfld, adrhoden )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      double precision epsln
      parameter ( epsln = 0.d0 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision sitodbar
      parameter ( sitodbar = 0.0001d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision eosmdjwfden(0:12)
      double precision eosmdjwfnum(0:11)
      common /parm_eos_mdjwf/ eosmdjwfnum, eosmdjwfden

C==============================================
C declare arguments
C==============================================
      double precision adlocpres(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrhoden(1-olx:snx+olx,1-oly:sny+oly)
      double precision adsfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtfld(1-olx:snx+olx,1-oly:sny+oly)
      integer imax
      integer imin
      integer jmax
      integer jmin
      double precision locpres(1-olx:snx+olx,1-oly:sny+oly)
      double precision sfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision tfld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adden
      double precision adp1
      double precision adp1t1
      double precision ads1
      double precision adsp5
      double precision adt1
      double precision adt2
      double precision den
      integer i
      integer j
      double precision p1
      double precision p1t1
      double precision s1
      double precision sp5
      double precision t1
      double precision t2

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adden = 0.d0
      adp1 = 0.d0
      adp1t1 = 0.d0
      ads1 = 0.d0
      adsp5 = 0.d0
      adt1 = 0.d0
      adt2 = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = jmax, jmin, -1
        do i = imax, imin, -1
          t1 = tfld(i,j)
          t2 = t1*t1
          s1 = sfld(i,j)
          if (s1 .gt. 0.d0) then
            sp5 = sqrt(s1)
          else
            s1 = 0.d0
            sp5 = 0.d0
          endif
          p1 = locpres(i,j)*sitodbar
          p1t1 = p1*t1
          den = eosmdjwfden(0)+t1*(eosmdjwfden(1)+t1*(eosmdjwfden(2)+t1*
     $(eosmdjwfden(3)+t1*eosmdjwfden(4))))+s1*(eosmdjwfden(5)+t1*(
     $eosmdjwfden(6)+eosmdjwfden(7)*t2)+sp5*(eosmdjwfden(8)+eosmdjwfden(
     $9)*t2))+p1*(eosmdjwfden(10)+p1t1*(eosmdjwfden(11)*t2+eosmdjwfden(
     $12)*p1))
          adden = adden-adrhoden(i,j)/((epsln+den)*(epsln+den))
          adrhoden(i,j) = 0.d0
          adp1 = adp1+adden*(p1*p1t1*eosmdjwfden(12)+eosmdjwfden(10)+
     $p1t1*(eosmdjwfden(11)*t2+eosmdjwfden(12)*p1))
          adp1t1 = adp1t1+adden*p1*(eosmdjwfden(11)*t2+eosmdjwfden(12)*
     $p1)
          ads1 = ads1+adden*(eosmdjwfden(5)+t1*(eosmdjwfden(6)+
     $eosmdjwfden(7)*t2)+sp5*(eosmdjwfden(8)+eosmdjwfden(9)*t2))
          adsp5 = adsp5+adden*s1*(eosmdjwfden(8)+eosmdjwfden(9)*t2)
          adt1 = adt1+adden*(t1*(t1*(t1*eosmdjwfden(4)+eosmdjwfden(3)+
     $t1*eosmdjwfden(4))+eosmdjwfden(2)+t1*(eosmdjwfden(3)+t1*
     $eosmdjwfden(4)))+eosmdjwfden(1)+t1*(eosmdjwfden(2)+t1*(
     $eosmdjwfden(3)+t1*eosmdjwfden(4)))+s1*(eosmdjwfden(6)+eosmdjwfden(
     $7)*t2))
          adt2 = adt2+adden*(s1*(t1*eosmdjwfden(7)+sp5*eosmdjwfden(9))+
     $p1*p1t1*eosmdjwfden(11))
          adden = 0.d0
          adp1 = adp1+adp1t1*t1
          adt1 = adt1+adp1t1*p1
          adp1t1 = 0.d0
          adlocpres(i,j) = adlocpres(i,j)+adp1*sitodbar
          adp1 = 0.d0
          s1 = sfld(i,j)
          if (s1 .gt. 0.d0) then
            ads1 = ads1+adsp5*(1./(2.*sqrt(s1)))
            adsp5 = 0.d0
          else
            adsp5 = 0.d0
            ads1 = 0.d0
          endif
          adsfld(i,j) = adsfld(i,j)+ads1
          ads1 = 0.d0
          adt1 = adt1+2*adt2*t1
          adt2 = 0.d0
          adtfld(i,j) = adtfld(i,j)+adt1
          adt1 = 0.d0
        end do
      end do

      end

      subroutine adfind_rhonum( imin, imax, jmin, jmax, locpres, 
     $adlocpres, tfld, adtfld, sfld, adsfld, adrhonum )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision sitodbar
      parameter ( sitodbar = 0.0001d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision eosmdjwfden(0:12)
      double precision eosmdjwfnum(0:11)
      common /parm_eos_mdjwf/ eosmdjwfnum, eosmdjwfden

C==============================================
C declare arguments
C==============================================
      double precision adlocpres(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrhonum(1-olx:snx+olx,1-oly:sny+oly)
      double precision adsfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtfld(1-olx:snx+olx,1-oly:sny+oly)
      integer imax
      integer imin
      integer jmax
      integer jmin
      double precision locpres(1-olx:snx+olx,1-oly:sny+oly)
      double precision sfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision tfld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adp1
      double precision ads1
      double precision adt1
      double precision adt2
      integer i
      integer j
      double precision p1
      double precision s1
      double precision t1
      double precision t2

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adp1 = 0.d0
      ads1 = 0.d0
      adt1 = 0.d0
      adt2 = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = jmax, jmin, -1
        adp1 = 0.d0
        ads1 = 0.d0
        adt1 = 0.d0
        adt2 = 0.d0
        do i = imax, imin, -1
          adp1 = 0.d0
          ads1 = 0.d0
          adt1 = 0.d0
          adt2 = 0.d0
          t1 = tfld(i,j)
          t2 = t1*t1
          s1 = sfld(i,j)
          p1 = locpres(i,j)*sitodbar
          adp1 = adp1+adrhonum(i,j)*(p1*(eosmdjwfnum(10)+eosmdjwfnum(11)
     $*t2)+eosmdjwfnum(7)+eosmdjwfnum(8)*t2+eosmdjwfnum(9)*s1+p1*(
     $eosmdjwfnum(10)+eosmdjwfnum(11)*t2))
          ads1 = ads1+adrhonum(i,j)*(s1*eosmdjwfnum(6)+eosmdjwfnum(4)+
     $eosmdjwfnum(5)*t1+eosmdjwfnum(6)*s1+p1*eosmdjwfnum(9))
          adt1 = adt1+adrhonum(i,j)*(t1*(t1*eosmdjwfnum(3)+eosmdjwfnum(
     $2)+eosmdjwfnum(3)*t1)+eosmdjwfnum(1)+t1*(eosmdjwfnum(2)+
     $eosmdjwfnum(3)*t1)+s1*eosmdjwfnum(5))
          adt2 = adt2+adrhonum(i,j)*p1*(eosmdjwfnum(8)+p1*eosmdjwfnum(
     $11))
          adrhonum(i,j) = 0.d0
          adlocpres(i,j) = adlocpres(i,j)+adp1*sitodbar
          adp1 = 0.d0
          adsfld(i,j) = adsfld(i,j)+ads1
          ads1 = 0.d0
          adt1 = adt1+2*adt2*t1
          adt2 = 0.d0
          adtfld(i,j) = adtfld(i,j)+adt1
          adt1 = 0.d0
        end do
      end do

      end

      subroutine adfind_rhop0( imin, imax, jmin, jmax, tfld, adtfld, 
     $sfld, adsfld, adrhop0 )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision eosjmdcfw(6)
      double precision eosjmdckfw(5)
      double precision eosjmdckp(14)
      double precision eosjmdcksw(7)
      double precision eosjmdcsw(9)
      common /parm_eos_jmd95/ eosjmdcfw, eosjmdcsw, eosjmdckfw, 
     $eosjmdcksw, eosjmdckp

C==============================================
C declare arguments
C==============================================
      double precision adrhop0(1-olx:snx+olx,1-oly:sny+oly)
      double precision adsfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtfld(1-olx:snx+olx,1-oly:sny+oly)
      integer imax
      integer imin
      integer jmax
      integer jmin
      double precision sfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision tfld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adrfresh
      double precision adrsalt
      double precision ads
      double precision ads3o2
      double precision adt
      double precision adt2
      double precision adt3
      double precision adt4
      integer i
      integer j
      double precision s
      double precision s3o2
      double precision t
      double precision t2
      double precision t3
      double precision t4

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adrfresh = 0.d0
      adrsalt = 0.d0
      ads = 0.d0
      ads3o2 = 0.d0
      adt = 0.d0
      adt2 = 0.d0
      adt3 = 0.d0
      adt4 = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = jmax, jmin, -1
        do i = imax, imin, -1
          t = tfld(i,j)
          t2 = t*t
          t3 = t2*t
          t4 = t3*t
          s = sfld(i,j)
          if (s .gt. 0.d0) then
            s3o2 = s*sqrt(s)
          else
            s = 0.d0
            s3o2 = 0.d0
          endif
          adrfresh = adrfresh+adrhop0(i,j)
          adrsalt = adrsalt+adrhop0(i,j)
          adrhop0(i,j) = 0.d0
          ads = ads+adrsalt*(eosjmdcsw(1)+eosjmdcsw(2)*t+eosjmdcsw(3)*
     $t2+eosjmdcsw(4)*t3+eosjmdcsw(5)*t4+2*eosjmdcsw(9)*s)
          ads3o2 = ads3o2+adrsalt*(eosjmdcsw(6)+eosjmdcsw(7)*t+
     $eosjmdcsw(8)*t2)
          adt = adt+adrsalt*(s*eosjmdcsw(2)+s3o2*eosjmdcsw(7))
          adt2 = adt2+adrsalt*(s*eosjmdcsw(3)+s3o2*eosjmdcsw(8))
          adt3 = adt3+adrsalt*s*eosjmdcsw(4)
          adt4 = adt4+adrsalt*s*eosjmdcsw(5)
          adrsalt = 0.d0
          adt = adt+adrfresh*(eosjmdcfw(2)+eosjmdcfw(6)*t4)
          adt2 = adt2+adrfresh*eosjmdcfw(3)
          adt3 = adt3+adrfresh*eosjmdcfw(4)
          adt4 = adt4+adrfresh*(eosjmdcfw(5)+eosjmdcfw(6)*t)
          adrfresh = 0.d0
          s = sfld(i,j)
          if (s .gt. 0.d0) then
            ads = ads+ads3o2*(s*(1./(2.*sqrt(s)))+sqrt(s))
            ads3o2 = 0.d0
          else
            ads3o2 = 0.d0
            ads = 0.d0
          endif
          adsfld(i,j) = adsfld(i,j)+ads
          ads = 0.d0
          adt = adt+adt4*t3
          adt3 = adt3+adt4*t
          adt4 = 0.d0
          adt = adt+adt3*t2
          adt2 = adt2+adt3*t
          adt3 = 0.d0
          adt = adt+2*adt2*t
          adt2 = 0.d0
          adtfld(i,j) = adtfld(i,j)+adt
          adt = 0.d0
        end do
      end do

      end

      subroutine adforward_step( iloop, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      real*8 comlev1_empmr_34h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadempmr/ comlev1_empmr_34h

      real*8 comlev1_kwx_41h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /cadkwx/ comlev1_kwx_41h

      real*8 comlev1_kwy_42h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /cadkwy/ comlev1_kwy_42h

      real*8 comlev1_rhoinsitu_36h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy,30)
      common /cadrhoinsitu/ comlev1_rhoinsitu_36h

      real*8 comlev1_totphihyd_45h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy,30)
      common /cadtotphihyd/ comlev1_totphihyd_45h

      double precision hmixlayer(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ivdconvcount(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision phihydlow(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rhoinsitu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision totphihyd(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_diag/ phihydlow, totphihyd, rhoinsitu, hmixlayer, 
     $ivdconvcount

      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

      double precision empmr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ffields_empmr/ empmr

      double precision kwx(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kwy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kwz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /gm_wtensor/ kwx, kwy, kwz

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer i_got_signal
      common /sig_i/ i_got_signal

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      integer iloop
      integer mythid

C==============================================
C declare local variables
C==============================================
      integer ip1
      integer ip2
      integer ip3
      integer ip4
      integer ip5
      logical modelend
      integer myiter
      double precision mytime

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      call autodiff_inadmode_unset( mythid )
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              empmr(ip1,ip2,ip3,ip4) = comlev1_empmr_34h(ip1,ip2,ip3,
     $ip4,ikey_dynamics)
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                rhoinsitu(ip1,ip2,ip3,ip4,ip5) = comlev1_rhoinsitu_36h(
     $ip1,ip2,ip3,ip4,ip5,ikey_dynamics)
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                kwx(ip1,ip2,ip3,ip4,ip5) = comlev1_kwx_41h(ip1,ip2,ip3,
     $ip4,ip5,ikey_dynamics)
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                kwy(ip1,ip2,ip3,ip4,ip5) = comlev1_kwy_42h(ip1,ip2,ip3,
     $ip4,ip5,ikey_dynamics)
              end do
            end do
          end do
        end do
      end do
      myiter = niter0+iloop
      mytime = starttime+deltatclock*float(iloop)
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                totphihyd(ip1,ip2,ip3,ip4,ip5) = comlev1_totphihyd_45h(
     $ip1,ip2,ip3,ip4,ip5,ikey_dynamics)
              end do
            end do
          end do
        end do
      end do
      call do_statevars_tave( mytime,myiter,mythid )
      if ( .not. useoffline) then
        call monitor( mytime,myiter,mythid )
      endif
      modelend = mytime .eq. endtime .or. myiter .eq. nenditer
      if (usesigreg) then
        modelend = modelend .or. i_got_signal .gt. 0
      endif
      call do_the_model_io( modelend,mytime,myiter,mythid )
      call do_write_pickup( modelend,mytime,myiter,mythid )
      call adautodiff_inadmode_set( mythid )
      call adcost_tile( mytime,mythid )
      if ( .not. useoffline) then
        call admonitor( mytime,myiter,mythid )
      endif
      call addo_fields_blocking_exchanges( mythid )
      call adtracers_correction_step( mytime,mythid )
      if (staggertimestep) then
        call adthermodynamics( myiter,mythid )
        call addo_stagger_fields_exchanges( mythid )
      endif
      if (exactconserv) then
        call adupdate_etah( mythid )
      endif
      call admomentum_correction_step( mytime,mythid )
      if (momstepping) then
        call adsolve_for_pressure( mythid )
      endif
      myiter = niter0+iloop-1
      call addynamics( myiter,mythid )
      if (implicitintgravwave) then
        call addo_stagger_fields_exchanges( mythid )
      endif
      myiter = niter0+iloop-1
      if ( .not. staggertimestep) then
        call adthermodynamics( myiter,mythid )
      endif
      call addo_oceanic_phys( mythid )
      myiter = niter0+iloop-1
      if (myiter .eq. niter0) then
        call adctrl_map_forcing( mythid )
      endif
      myiter = niter0+iloop-1
      mytime = starttime+float(iloop-1)*deltatclock
      call adload_fields_driver( mytime,myiter,mythid )
      call adautodiff_inadmode_unset( mythid )

      end

      subroutine mdforward_step( iloop, mytime, myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      real*8 comlev1_cmeanthetauvel_28h(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy,30)
      common /cadcmeanthetauvel/ comlev1_cmeanthetauvel_28h

      real*8 comlev1_cmeanthetavvel_29h(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy,30)
      common /cadcmeanthetavvel/ comlev1_cmeanthetavvel_29h

      real*8 comlev1_empmr_34h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadempmr/ comlev1_empmr_34h

      real*8 comlev1_empmr0_20h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadempmr0/ comlev1_empmr0_20h

      real*8 comlev1_empmr1_21h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadempmr1/ comlev1_empmr1_21h

      real*8 comlev1_ivdconvcount_40h(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy,30)
      common /cadivdconvcounu/ comlev1_ivdconvcount_40h

      real*8 comlev1_kwz_43h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /cadkw2/ comlev1_kwz_43h

      real*8 comlev1_kwx_41h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /cadkwx/ comlev1_kwx_41h

      real*8 comlev1_kwy_42h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /cadkwy/ comlev1_kwy_42h

      real*8 comlev1_pmepr_35h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadpmeps/ comlev1_pmepr_35h

      real*8 comlev1_pmepr_9h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadpmept/ comlev1_pmepr_9h

      real*8 comlev1_qnet0_18h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadqnet0/ comlev1_qnet0_18h

      real*8 comlev1_qnet1_19h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadqnet1/ comlev1_qnet1_19h

      real*8 comlev1_rhoinsitu_36h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy,30)
      common /cadrhoinsitu/ comlev1_rhoinsitu_36h

      real*8 comlev1_salt_44h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /cadsal2/ comlev1_salt_44h

      real*8 comlev1_saltflux0_26h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,
     $30)
      common /cadsaltflux0/ comlev1_saltflux0_26h

      real*8 comlev1_saltflux1_27h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,
     $30)
      common /cadsaltflux1/ comlev1_saltflux1_27h

      real*8 comlev1_sss0_24h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadsss0/ comlev1_sss0_24h

      real*8 comlev1_sss1_25h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadsss1/ comlev1_sss1_25h

      real*8 comlev1_sst0_22h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadsst0/ comlev1_sst0_22h

      real*8 comlev1_sst1_23h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadsst1/ comlev1_sst1_23h

      real*8 comlev1_surfaceforcingtice_39h(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy,30)
      common /cadsurfaceforcingticf/ comlev1_surfaceforcingtice_39h

      real*8 comlev1_surfaceforcingtice_33h(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy,30)
      common /cadsurfaceforcingticg/ comlev1_surfaceforcingtice_33h

      real*8 comlev1_surfaceforcingt_38h(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy,30)
      common /cadsurfaceforcingw/ comlev1_surfaceforcingt_38h

      real*8 comlev1_surfaceforcings_37h(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy,30)
      common /cadsurfaceforcingx/ comlev1_surfaceforcings_37h

      real*8 comlev1_taux0_14h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadtaux0/ comlev1_taux0_14h

      real*8 comlev1_taux1_15h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadtaux1/ comlev1_taux1_15h

      real*8 comlev1_tauy0_16h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadtauy0/ comlev1_tauy0_16h

      real*8 comlev1_tauy1_17h(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy,30)
      common /cadtauy1/ comlev1_tauy1_17h

      real*8 comlev1_theta_30h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,
     $30)
      common /cadthetl/ comlev1_theta_30h

      real*8 comlev1_totphihyd_45h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy,30)
      common /cadtotphihyd/ comlev1_totphihyd_45h

      real*8 comlev1_totphihyd_8h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy,30)
      common /cadtotphihyg/ comlev1_totphihyd_8h

      real*8 comlev1_unm1_12h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /cadunm1/ comlev1_unm1_12h

      real*8 comlev1_uveld_10h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,
     $30)
      common /caduvele/ comlev1_uveld_10h

      real*8 comlev1_uvel_31h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /caduveo/ comlev1_uvel_31h

      real*8 comlev1_vnm1_13h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /cadvnm1/ comlev1_vnm1_13h

      real*8 comlev1_vveld_11h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,
     $30)
      common /cadvvele/ comlev1_vveld_11h

      real*8 comlev1_vvel_32h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /cadvveo/ comlev1_vvel_32h

      double precision cmeantheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision cmeanthetauvel(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy)
      double precision cmeanthetavvel(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy)
      double precision cmeanuvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision cmeanvvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /cost_mean_r/ cmeantheta, cmeanuvel, cmeanvvel, 
     $cmeanthetauvel, cmeanthetavvel

      double precision etanm1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision unm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uveld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vveld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_cd/ uveld, vveld, etanm1, unm1, vnm1

      double precision hmixlayer(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ivdconvcount(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision phihydlow(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rhoinsitu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision totphihyd(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_diag/ phihydlow, totphihyd, rhoinsitu, hmixlayer, 
     $ivdconvcount

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

      double precision detahdt(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision etahnm1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision pmepr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /exact_eta_local/ etahnm1, detahdt, pmepr

      double precision empmr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ffields_empmr/ empmr

      double precision kwx(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kwy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kwz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /gm_wtensor/ kwx, kwy, kwz

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer i_got_signal
      common /sig_i/ i_got_signal

      double precision surfaceforcings(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy)
      double precision surfaceforcingt(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy)
      double precision surfaceforcingtice(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision surfaceforcingu(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy)
      double precision surfaceforcingv(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy)
      common /surface_forcing/ surfaceforcingu, surfaceforcingv, 
     $surfaceforcingt, surfaceforcings, surfaceforcingtice

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

      double precision empmr0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision empmr1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision qnet0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision qnet1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision saltflux0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision saltflux1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision sss0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision sss1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision sst0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision sst1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision taux0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision taux1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tauy0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tauy1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /tdfields/ taux0, tauy0, qnet0, empmr0, sst0, sss0, taux1, 
     $tauy1, qnet1, empmr1, sst1, sss1, saltflux0, saltflux1

C==============================================
C declare arguments
C==============================================
      integer iloop
      integer myiter
      integer mythid
      double precision mytime

C==============================================
C declare local variables
C==============================================
      integer iq0
      integer iq1
      integer iq2
      integer iq3
      integer iq4
      integer iq5
      integer iq6
      integer iq7
      integer iq8
      integer iq9
      integer iqa
      integer iqb
      integer iqc
      integer iqd
      integer iqe
      integer iqf
      integer iqg
      integer iqh
      integer iqi
      integer iqj
      integer iqk
      integer iql
      integer iqm
      integer iqn
      integer iqo
      integer iqp
      integer iqq
      integer iqr
      integer iqs
      integer iqt
      integer iqu
      integer iqv
      integer iqw
      integer iqx
      integer iqy
      integer iqz
      integer ir0
      integer ir1
      integer ir2
      integer ir3
      integer ir4
      integer ir5
      integer ir6
      integer ir7
      integer ir8
      integer ir9
      integer ira
      integer irb
      integer irc
      integer ird
      integer ire
      integer irf
      integer irg
      integer irh
      integer iri
      integer irj
      integer irk
      integer irl
      integer irm
      integer irn
      integer iro
      integer irp
      integer irq
      integer irr
      integer irs
      integer irt
      integer iru
      integer irv
      integer irw
      integer irx
      integer iry
      integer irz
      integer is0
      integer is1
      integer is2
      integer is3
      integer is4
      integer is5
      integer is6
      integer is7
      integer is8
      integer is9
      integer isa
      integer isb
      integer isc
      integer isd
      integer ise
      integer isf
      integer isg
      integer ish
      integer isi
      integer isj
      integer isk
      integer isl
      integer ism
      integer isn
      integer iso
      integer isp
      integer isq
      integer isr
      integer iss
      integer ist
      integer isu
      integer isv
      integer isw
      integer isx
      integer isy
      integer isz
      integer it0
      integer it1
      integer it2
      integer it3
      integer it4
      integer it5
      integer it6
      integer it7
      integer it8
      integer it9
      integer ita
      integer itb
      integer itc
      integer itd
      integer ite
      integer itf
      integer itg
      integer ith
      integer iti
      integer itj
      integer itk
      integer itl
      integer itm
      integer itn
      integer ito
      integer itp
      integer itq
      integer itr
      integer its
      integer itt
      integer itu
      integer itv
      integer itw
      integer itx
      integer ity
      integer itz
      integer iua
      integer iub
      integer iuc
      integer iud
      integer iue
      integer iuf
      integer iug
      integer iuh
      integer iui
      integer iuj
      integer iuk
      integer iul
      integer ium
      integer iun
      integer iuo
      integer iup
      integer iuq
      integer iur
      integer ius
      integer iut
      logical modelend

C**********************************************
C executable statements of routine
C**********************************************
      call autodiff_inadmode_unset( mythid )
      myiter = niter0+iloop-1
      mytime = starttime+float(iloop-1)*deltatclock
      do iut = 1, nsy
        do ius = 1, nsx
          do iur = 1, nr
            do iuq = 1-oly, sny+oly
              do iup = 1-olx, snx+olx
                comlev1_totphihyd_8h(iup,iuq,iur,ius,iut,ikey_dynamics) 
     $= totphihyd(iup,iuq,iur,ius,iut)
              end do
            end do
          end do
        end do
      end do
      do iuo = 1, nsy
        do iun = 1, nsx
          do ium = 1-oly, sny+oly
            do iul = 1-olx, snx+olx
              comlev1_pmepr_9h(iul,ium,iun,iuo,ikey_dynamics) = pmepr(
     $iul,ium,iun,iuo)
            end do
          end do
        end do
      end do
      do iuk = 1, nsy
        do iuj = 1, nsx
          do iui = 1, nr
            do iuh = 1-oly, sny+oly
              do iug = 1-olx, snx+olx
                comlev1_uveld_10h(iug,iuh,iui,iuj,iuk,ikey_dynamics) = 
     $uveld(iug,iuh,iui,iuj,iuk)
              end do
            end do
          end do
        end do
      end do
      do iuf = 1, nsy
        do iue = 1, nsx
          do iud = 1, nr
            do iuc = 1-oly, sny+oly
              do iub = 1-olx, snx+olx
                comlev1_vveld_11h(iub,iuc,iud,iue,iuf,ikey_dynamics) = 
     $vveld(iub,iuc,iud,iue,iuf)
              end do
            end do
          end do
        end do
      end do
      do iua = 1, nsy
        do it9 = 1, nsx
          do it8 = 1, nr
            do it7 = 1-oly, sny+oly
              do it6 = 1-olx, snx+olx
                comlev1_unm1_12h(it6,it7,it8,it9,iua,ikey_dynamics) = 
     $unm1(it6,it7,it8,it9,iua)
              end do
            end do
          end do
        end do
      end do
      do it5 = 1, nsy
        do it4 = 1, nsx
          do it3 = 1, nr
            do it2 = 1-oly, sny+oly
              do it1 = 1-olx, snx+olx
                comlev1_vnm1_13h(it1,it2,it3,it4,it5,ikey_dynamics) = 
     $vnm1(it1,it2,it3,it4,it5)
              end do
            end do
          end do
        end do
      end do
      do it0 = 1, nsy
        do itz = 1, nsx
          do ity = 1-oly, sny+oly
            do itx = 1-olx, snx+olx
              comlev1_taux0_14h(itx,ity,itz,it0,ikey_dynamics) = taux0(
     $itx,ity,itz,it0)
            end do
          end do
        end do
      end do
      do itw = 1, nsy
        do itv = 1, nsx
          do itu = 1-oly, sny+oly
            do itt = 1-olx, snx+olx
              comlev1_taux1_15h(itt,itu,itv,itw,ikey_dynamics) = taux1(
     $itt,itu,itv,itw)
            end do
          end do
        end do
      end do
      do its = 1, nsy
        do itr = 1, nsx
          do itq = 1-oly, sny+oly
            do itp = 1-olx, snx+olx
              comlev1_tauy0_16h(itp,itq,itr,its,ikey_dynamics) = tauy0(
     $itp,itq,itr,its)
            end do
          end do
        end do
      end do
      do ito = 1, nsy
        do itn = 1, nsx
          do itm = 1-oly, sny+oly
            do itl = 1-olx, snx+olx
              comlev1_tauy1_17h(itl,itm,itn,ito,ikey_dynamics) = tauy1(
     $itl,itm,itn,ito)
            end do
          end do
        end do
      end do
      do itk = 1, nsy
        do itj = 1, nsx
          do iti = 1-oly, sny+oly
            do ith = 1-olx, snx+olx
              comlev1_qnet0_18h(ith,iti,itj,itk,ikey_dynamics) = qnet0(
     $ith,iti,itj,itk)
            end do
          end do
        end do
      end do
      do itg = 1, nsy
        do itf = 1, nsx
          do ite = 1-oly, sny+oly
            do itd = 1-olx, snx+olx
              comlev1_qnet1_19h(itd,ite,itf,itg,ikey_dynamics) = qnet1(
     $itd,ite,itf,itg)
            end do
          end do
        end do
      end do
      do itc = 1, nsy
        do itb = 1, nsx
          do ita = 1-oly, sny+oly
            do is9 = 1-olx, snx+olx
              comlev1_empmr0_20h(is9,ita,itb,itc,ikey_dynamics) = 
     $empmr0(is9,ita,itb,itc)
            end do
          end do
        end do
      end do
      do is8 = 1, nsy
        do is7 = 1, nsx
          do is6 = 1-oly, sny+oly
            do is5 = 1-olx, snx+olx
              comlev1_empmr1_21h(is5,is6,is7,is8,ikey_dynamics) = 
     $empmr1(is5,is6,is7,is8)
            end do
          end do
        end do
      end do
      do is4 = 1, nsy
        do is3 = 1, nsx
          do is2 = 1-oly, sny+oly
            do is1 = 1-olx, snx+olx
              comlev1_sst0_22h(is1,is2,is3,is4,ikey_dynamics) = sst0(
     $is1,is2,is3,is4)
            end do
          end do
        end do
      end do
      do is0 = 1, nsy
        do isz = 1, nsx
          do isy = 1-oly, sny+oly
            do isx = 1-olx, snx+olx
              comlev1_sst1_23h(isx,isy,isz,is0,ikey_dynamics) = sst1(
     $isx,isy,isz,is0)
            end do
          end do
        end do
      end do
      do isw = 1, nsy
        do isv = 1, nsx
          do isu = 1-oly, sny+oly
            do ist = 1-olx, snx+olx
              comlev1_sss0_24h(ist,isu,isv,isw,ikey_dynamics) = sss0(
     $ist,isu,isv,isw)
            end do
          end do
        end do
      end do
      do iss = 1, nsy
        do isr = 1, nsx
          do isq = 1-oly, sny+oly
            do isp = 1-olx, snx+olx
              comlev1_sss1_25h(isp,isq,isr,iss,ikey_dynamics) = sss1(
     $isp,isq,isr,iss)
            end do
          end do
        end do
      end do
      do iso = 1, nsy
        do isn = 1, nsx
          do ism = 1-oly, sny+oly
            do isl = 1-olx, snx+olx
              comlev1_saltflux0_26h(isl,ism,isn,iso,ikey_dynamics) = 
     $saltflux0(isl,ism,isn,iso)
            end do
          end do
        end do
      end do
      do isk = 1, nsy
        do isj = 1, nsx
          do isi = 1-oly, sny+oly
            do ish = 1-olx, snx+olx
              comlev1_saltflux1_27h(ish,isi,isj,isk,ikey_dynamics) = 
     $saltflux1(ish,isi,isj,isk)
            end do
          end do
        end do
      end do
      do isg = 1, nsy
        do isf = 1, nsx
          do ise = 1, nr
            do isd = 1-oly, sny+oly
              do isc = 1-olx, snx+olx
                comlev1_cmeanthetauvel_28h(isc,isd,ise,isf,isg,
     $ikey_dynamics) = cmeanthetauvel(isc,isd,ise,isf,isg)
              end do
            end do
          end do
        end do
      end do
      do isb = 1, nsy
        do isa = 1, nsx
          do ir9 = 1, nr
            do ir8 = 1-oly, sny+oly
              do ir7 = 1-olx, snx+olx
                comlev1_cmeanthetavvel_29h(ir7,ir8,ir9,isa,isb,
     $ikey_dynamics) = cmeanthetavvel(ir7,ir8,ir9,isa,isb)
              end do
            end do
          end do
        end do
      end do
      do ir6 = 1, nsy
        do ir5 = 1, nsx
          do ir4 = 1, nr
            do ir3 = 1-oly, sny+oly
              do ir2 = 1-olx, snx+olx
                comlev1_theta_30h(ir2,ir3,ir4,ir5,ir6,ikey_dynamics) = 
     $theta(ir2,ir3,ir4,ir5,ir6)
              end do
            end do
          end do
        end do
      end do
      do ir1 = 1, nsy
        do ir0 = 1, nsx
          do irz = 1, nr
            do iry = 1-oly, sny+oly
              do irx = 1-olx, snx+olx
                comlev1_uvel_31h(irx,iry,irz,ir0,ir1,ikey_dynamics) = 
     $uvel(irx,iry,irz,ir0,ir1)
              end do
            end do
          end do
        end do
      end do
      do ir1 = 1, nsy
        do ir0 = 1, nsx
          do irz = 1, nr
            do iry = 1-oly, sny+oly
              do irx = 1-olx, snx+olx
                comlev1_vvel_32h(irx,iry,irz,ir0,ir1,ikey_dynamics) = 
     $vvel(irx,iry,irz,ir0,ir1)
              end do
            end do
          end do
        end do
      end do
      call load_fields_driver( mytime,myiter,mythid )
      if (myiter .eq. niter0) then
        call ctrl_map_forcing( mythid )
      endif
      do irw = 1, nsy
        do irv = 1, nsx
          do iru = 1-oly, sny+oly
            do irt = 1-olx, snx+olx
              comlev1_surfaceforcingtice_33h(irt,iru,irv,irw,
     $ikey_dynamics) = surfaceforcingtice(irt,iru,irv,irw)
            end do
          end do
        end do
      end do
      call mddo_oceanic_phys( mytime,myiter,mythid )
      do irs = 1, nsy
        do irr = 1, nsx
          do irq = 1-oly, sny+oly
            do irp = 1-olx, snx+olx
              comlev1_empmr_34h(irp,irq,irr,irs,ikey_dynamics) = empmr(
     $irp,irq,irr,irs)
            end do
          end do
        end do
      end do
      do iro = 1, nsy
        do irn = 1, nsx
          do irm = 1-oly, sny+oly
            do irl = 1-olx, snx+olx
              comlev1_pmepr_35h(irl,irm,irn,iro,ikey_dynamics) = pmepr(
     $irl,irm,irn,iro)
            end do
          end do
        end do
      end do
      do irk = 1, nsy
        do irj = 1, nsx
          do iri = 1, nr
            do irh = 1-oly, sny+oly
              do irg = 1-olx, snx+olx
                comlev1_rhoinsitu_36h(irg,irh,iri,irj,irk,ikey_dynamics)
     $ = rhoinsitu(irg,irh,iri,irj,irk)
              end do
            end do
          end do
        end do
      end do
      do irf = 1, nsy
        do ire = 1, nsx
          do ird = 1-oly, sny+oly
            do irc = 1-olx, snx+olx
              comlev1_surfaceforcings_37h(irc,ird,ire,irf,ikey_dynamics)
     $ = surfaceforcings(irc,ird,ire,irf)
            end do
          end do
        end do
      end do
      do irb = 1, nsy
        do ira = 1, nsx
          do iq9 = 1-oly, sny+oly
            do iq8 = 1-olx, snx+olx
              comlev1_surfaceforcingt_38h(iq8,iq9,ira,irb,ikey_dynamics)
     $ = surfaceforcingt(iq8,iq9,ira,irb)
            end do
          end do
        end do
      end do
      do iq7 = 1, nsy
        do iq6 = 1, nsx
          do iq5 = 1-oly, sny+oly
            do iq4 = 1-olx, snx+olx
              comlev1_surfaceforcingtice_39h(iq4,iq5,iq6,iq7,
     $ikey_dynamics) = surfaceforcingtice(iq4,iq5,iq6,iq7)
            end do
          end do
        end do
      end do
      do iq3 = 1, nsy
        do iq2 = 1, nsx
          do iq1 = 1, nr
            do iq0 = 1-oly, sny+oly
              do iqz = 1-olx, snx+olx
                comlev1_ivdconvcount_40h(iqz,iq0,iq1,iq2,iq3,
     $ikey_dynamics) = ivdconvcount(iqz,iq0,iq1,iq2,iq3)
              end do
            end do
          end do
        end do
      end do
      do iqy = 1, nsy
        do iqx = 1, nsx
          do iqw = 1, nr
            do iqv = 1-oly, sny+oly
              do iqu = 1-olx, snx+olx
                comlev1_kwx_41h(iqu,iqv,iqw,iqx,iqy,ikey_dynamics) = 
     $kwx(iqu,iqv,iqw,iqx,iqy)
              end do
            end do
          end do
        end do
      end do
      do iqt = 1, nsy
        do iqs = 1, nsx
          do iqr = 1, nr
            do iqq = 1-oly, sny+oly
              do iqp = 1-olx, snx+olx
                comlev1_kwy_42h(iqp,iqq,iqr,iqs,iqt,ikey_dynamics) = 
     $kwy(iqp,iqq,iqr,iqs,iqt)
              end do
            end do
          end do
        end do
      end do
      do iqo = 1, nsy
        do iqn = 1, nsx
          do iqm = 1, nr
            do iql = 1-oly, sny+oly
              do iqk = 1-olx, snx+olx
                comlev1_kwz_43h(iqk,iql,iqm,iqn,iqo,ikey_dynamics) = 
     $kwz(iqk,iql,iqm,iqn,iqo)
              end do
            end do
          end do
        end do
      end do
      if ( .not. staggertimestep) then
        do iqj = 1, nsy
          do iqi = 1, nsx
            do iqh = 1, nr
              do iqg = 1-oly, sny+oly
                do iqf = 1-olx, snx+olx
                  comlev1_salt_44h(iqf,iqg,iqh,iqi,iqj,ikey_dynamics) = 
     $salt(iqf,iqg,iqh,iqi,iqj)
                end do
              end do
            end do
          end do
        end do
        call mdthermodynamics( mytime,myiter,mythid )
      endif
      if (implicitintgravwave) then
        call do_stagger_fields_exchanges( mytime,myiter,mythid )
      endif
      call mddynamics( mytime,myiter,mythid )
      myiter = niter0+iloop
      mytime = starttime+deltatclock*float(iloop)
      if (momstepping) then
        call solve_for_pressure( mytime,myiter,mythid )
      endif
      call momentum_correction_step( mytime,myiter,mythid )
      if (exactconserv) then
        call update_etah( mytime,myiter,mythid )
      endif
      if (staggertimestep) then
        call do_stagger_fields_exchanges( mytime,myiter,mythid )
        call mdthermodynamics( mytime,myiter,mythid )
      endif
      do iqe = 1, nsy
        do iqd = 1, nsx
          do iqc = 1, nr
            do iqb = 1-oly, sny+oly
              do iqa = 1-olx, snx+olx
                comlev1_totphihyd_45h(iqa,iqb,iqc,iqd,iqe,ikey_dynamics)
     $ = totphihyd(iqa,iqb,iqc,iqd,iqe)
              end do
            end do
          end do
        end do
      end do
      call mdtracers_correction_step( mytime,myiter,mythid )
      call do_fields_blocking_exchanges( mythid )
      call do_statevars_tave( mytime,myiter,mythid )
      if ( .not. useoffline) then
        call monitor( mytime,myiter,mythid )
      endif
      call mdcost_tile( mytime,myiter,mythid )
      modelend = mytime .eq. endtime .or. myiter .eq. nenditer
      if (usesigreg) then
        modelend = modelend .or. i_got_signal .gt. 0
      endif
      call do_the_model_io( modelend,mytime,myiter,mythid )
      call do_write_pickup( modelend,mytime,myiter,mythid )
      call autodiff_inadmode_set( mythid )
      end

      subroutine adfreeze( bi, bj, imin, imax, jmin, jmax, k )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

C==============================================
C declare arguments
C==============================================
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      double precision tfreezing

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      tfreezing = -1.9d0
      do j = jmin, jmax
        do i = imin, imax
          if (gt(i,j,k,bi,bj) .lt. tfreezing) then
            adgt(i,j,k,bi,bj) = 0.d0
          endif
        end do
      end do

      end

      subroutine adfreeze_surface( mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision adsurfaceforcings(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingt(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingtice(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingu(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingv(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      common /adsurface_forcing/ adsurfaceforcingu, adsurfaceforcingv, 
     $adsurfaceforcingt, adsurfaceforcings, adsurfaceforcingtice

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      integer mythid

C==============================================
C declare local variables
C==============================================
      integer bi
      integer bj
      integer i
      integer j
      integer k
      double precision tfreezing

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (usingpcoords) then
        k = nr
      else
        k = 1
      endif
      tfreezing = -1.9d0
      do bj = mybylo(mythid), mybyhi(mythid)
        do bi = mybxlo(mythid), mybxhi(mythid)
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              if (theta(i,j,k,bi,bj) .lt. tfreezing) then
                adtheta(i,j,k,bi,bj) = 0.d0
                adtheta(i,j,k,bi,bj) = adtheta(i,j,k,bi,bj)-
     $adsurfaceforcingtice(i,j,bi,bj)*(drf(k)*hfacc(i,j,k,bi,bj)/
     $dttracerlev(k))
                adsurfaceforcingtice(i,j,bi,bj) = 0.d0
              else
                adsurfaceforcingtice(i,j,bi,bj) = 0.d0
              endif
            end do
          end do
        end do
      end do

      end

      subroutine adgad_advection( implicitadvection, advectionscheme, 
     $vertadvecscheme, traceridentity, deltatlev, uvel, aduvel, vvel, 
     $advvel, wvel, adwvel, tracer, adtracer, adgtracer, bi, bj, mythid 
     $)
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer enum_dst2
      parameter ( enum_dst2 = 20 )
      integer enum_dst3
      parameter ( enum_dst3 = 30 )
      integer enum_dst3_flux_limit
      parameter ( enum_dst3_flux_limit = 33 )
      integer enum_flux_limit
      parameter ( enum_flux_limit = 77 )
      integer enum_upwind_1rst
      parameter ( enum_upwind_1rst = 1 )
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer maxpass
      parameter ( maxpass = 2 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      real*8 comlev1_bibj_k_gad_pass_localti(1-olx:snx+olx,1-oly:sny+
     $oly,7200)
      common /cadlocaltij/ comlev1_bibj_k_gad_pass_localti

      real*8 comlev1_bibj_k_gad_pass_localtj(1-olx:snx+olx,1-oly:sny+
     $oly,7200)
      common /cadlocaltik/ comlev1_bibj_k_gad_pass_localtj

      real*8 comlev1_bibj_k_gad_rtrans_2h(1-olx:snx+olx,1-oly:sny+oly,
     $3600)
      common /cadrtrant/ comlev1_bibj_k_gad_rtrans_2h

      real*8 comlev1_bibj_k_gad_tracer_1h(1-olx:snx+olx,1-oly:sny+oly,
     $3600)
      common /cadtracer/ comlev1_bibj_k_gad_tracer_1h

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      double precision adgtracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer advectionscheme
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      double precision deltatlev(nr)
      logical implicitadvection
      integer mythid
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer traceridentity
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer vertadvecscheme
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)

C==============================================
C declare local variables
C==============================================
      integer act0
      integer act1
      integer act2
      integer act3
      integer act4
      double precision adaf(1-olx:snx+olx,1-oly:sny+oly)
      double precision adfvert(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision adlocaltij(1-olx:snx+olx,1-oly:sny+oly)
      double precision adlocaltijk(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adrtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrtranskp1(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision af(1-olx:snx+olx,1-oly:sny+oly)
      logical calc_fluxes_x
      logical calc_fluxes_y
      logical e_edge
      integer i
      integer igadkey
      integer imaxupd
      integer iminupd
      logical interioronly
      integer ip1
      integer ip2
      integer ip3
      integer ipass
      integer j
      integer jmaxupd
      integer jminupd
      integer k
      integer kdown
      integer kkey
      double precision kp1msk
      integer kup
      double precision localtij(1-olx:snx+olx,1-oly:sny+oly)
      double precision localtijk(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision masklocs(1-olx:snx+olx,1-oly:sny+oly)
      double precision masklocw(1-olx:snx+olx,1-oly:sny+oly)
      integer max0
      integer max1
      integer max2
      integer max3
      logical n_edge
      integer ncface
      integer npass
      logical overlaponly
      integer passkey
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision rtranskp1(1-olx:snx+olx,1-oly:sny+oly)
      logical s_edge
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)
      logical w_edge
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly)
      logical withsigns
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adaf(ip1,ip2) = 0.d0
        end do
      end do
      do ip3 = 1, 2
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            adfvert(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adlocaltij(ip1,ip2) = 0.d0
        end do
      end do
      do ip3 = 1, nr
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            adlocaltijk(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adrtrans(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adrtranskp1(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adufld(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adutrans(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advfld(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advtrans(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adwfld(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      act0 = traceridentity
      max0 = maxpass
      act1 = bi-mybxlo(mythid)
      max1 = mybxhi(mythid)-mybxlo(mythid)+1
      act2 = bj-mybylo(mythid)
      max2 = mybyhi(mythid)-mybylo(mythid)+1
      act3 = mythid-1
      max3 = ntx*nty
      act4 = ikey_dynamics-1
      igadkey = act0+act1*max0+act2*max0*max1+act3*max0*max1*max2+act4*
     $max0*max1*max2*max3
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          localtij(i,j) = 0.d0
        end do
      end do
      if (usecubedsphereexchange) then
        npass = 3
        ncface = bi
        n_edge =  .true. 
        s_edge =  .true. 
        e_edge =  .true. 
        w_edge =  .true. 
      else
        npass = 2
        ncface = 0
        n_edge =  .false. 
        s_edge =  .false. 
        e_edge =  .false. 
        w_edge =  .false. 
      endif
      do k = 1, nr
        call calc_common_factors( uvel,vvel,ufld,vfld,utrans,vtrans,xa,
     $ya,k,bi,bj,mythid )
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            localtij(i,j) = tracer(i,j,k,bi,bj)
            masklocw(i,j) = maskw(i,j,k,bi,bj)
            masklocs(i,j) = masks(i,j,k,bi,bj)
          end do
        end do
        if (usecubedsphereexchange) then
          withsigns =  .false. 
          call fill_cs_corner_uv_rs( withsigns,masklocw,masklocs,bi,bj,
     $mythid )
        endif
        do ipass = 1, npass
          interioronly =  .false. 
          overlaponly =  .false. 
          if (usecubedsphereexchange) then
            if (ipass .eq. 1) then
              overlaponly = mod(ncface,3) .eq. 0
              interioronly = mod(ncface,3) .ne. 0
              calc_fluxes_x = ncface .eq. 6 .or. ncface .eq. 1 .or. 
     $ncface .eq. 2
              calc_fluxes_y = ncface .eq. 3 .or. ncface .eq. 4 .or. 
     $ncface .eq. 5
            else if (ipass .eq. 2) then
              overlaponly = mod(ncface,3) .eq. 2
              interioronly = mod(ncface,3) .eq. 1
              calc_fluxes_x = ncface .eq. 2 .or. ncface .eq. 3 .or. 
     $ncface .eq. 4
              calc_fluxes_y = ncface .eq. 5 .or. ncface .eq. 6 .or. 
     $ncface .eq. 1
            else
              interioronly =  .true. 
              calc_fluxes_x = ncface .eq. 5 .or. ncface .eq. 6
              calc_fluxes_y = ncface .eq. 2 .or. ncface .eq. 3
            endif
          else
            calc_fluxes_x = mod(ipass,2) .eq. 1
            calc_fluxes_y =  .not. calc_fluxes_x
          endif
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              af(i,j) = 0.
            end do
          end do
          if (calc_fluxes_x) then
            if (( .not. overlaponly) .or. n_edge .or. s_edge) then
              if (overlaponly) then
                call fill_cs_corner_tr_rl( 1, .false. ,localtij,bi,bj,
     $mythid )
              endif
              if (advectionscheme .eq. enum_upwind_1rst .or. 
     $advectionscheme .eq. enum_dst2) then
                call gad_dst2u1_adv_x( bi,bj,k,advectionscheme, .true. ,
     $deltatlev(k),utrans,ufld,localtij,af,mythid )
              else if (advectionscheme .eq. enum_flux_limit) then
                call gad_fluxlimit_adv_x( bi,bj,k, .true. ,deltatlev(k),
     $utrans,ufld,masklocw,localtij,af,mythid )
              else if (advectionscheme .eq. enum_dst3) then
                call gad_dst3_adv_x( bi,bj,k, .true. ,deltatlev(k),
     $utrans,ufld,masklocw,localtij,af,mythid )
              else if (advectionscheme .eq. enum_dst3_flux_limit) then
                call gad_dst3fl_adv_x( bi,bj,k, .true. ,deltatlev(k),
     $utrans,ufld,masklocw,localtij,af,mythid )
              endif
              if (overlaponly .and. ipass .eq. 1) then
                call fill_cs_corner_tr_rl( 2, .false. ,localtij,bi,bj,
     $mythid )
              endif
            endif
            if (overlaponly) then
              iminupd = 1-olx+1
              imaxupd = snx+olx-1
              if (w_edge) then
                iminupd = 1
              endif
              if (e_edge) then
                imaxupd = snx
              endif
              if (s_edge) then
                do j = 1-oly, 0
                  do i = iminupd, imaxupd
                    localtij(i,j) = localtij(i,j)-deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)*(af(i+1,j)-af(i,j)-tracer(i,j,k,bi,bj)
     $*(utrans(i+1,j)-utrans(i,j)))
                  end do
                end do
              endif
              if (n_edge) then
                do j = sny+1, sny+oly
                  do i = iminupd, imaxupd
                    localtij(i,j) = localtij(i,j)-deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)*(af(i+1,j)-af(i,j)-tracer(i,j,k,bi,bj)
     $*(utrans(i+1,j)-utrans(i,j)))
                  end do
                end do
              endif
            else
              jminupd = 1-oly
              jmaxupd = sny+oly
              if (interioronly .and. s_edge) then
                jminupd = 1
              endif
              if (interioronly .and. n_edge) then
                jmaxupd = sny
              endif
              do j = jminupd, jmaxupd
                do i = 1-olx+1, snx+olx-1
                  localtij(i,j) = localtij(i,j)-deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)*(af(i+1,j)-af(i,j)-tracer(i,j,k,bi,bj)
     $*(utrans(i+1,j)-utrans(i,j)))
                end do
              end do
            endif
          endif
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              af(i,j) = 0.
            end do
          end do
          if (calc_fluxes_y) then
            if (( .not. overlaponly) .or. e_edge .or. w_edge) then
              if (overlaponly) then
                call fill_cs_corner_tr_rl( 2, .false. ,localtij,bi,bj,
     $mythid )
              endif
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  af(i,j) = 0.
                end do
              end do
              if (advectionscheme .eq. enum_upwind_1rst .or. 
     $advectionscheme .eq. enum_dst2) then
                call gad_dst2u1_adv_y( bi,bj,k,advectionscheme, .true. ,
     $deltatlev(k),vtrans,vfld,localtij,af,mythid )
              else if (advectionscheme .eq. enum_flux_limit) then
                call gad_fluxlimit_adv_y( bi,bj,k, .true. ,deltatlev(k),
     $vtrans,vfld,masklocs,localtij,af,mythid )
              else if (advectionscheme .eq. enum_dst3) then
                call gad_dst3_adv_y( bi,bj,k, .true. ,deltatlev(k),
     $vtrans,vfld,masklocs,localtij,af,mythid )
              else if (advectionscheme .eq. enum_dst3_flux_limit) then
                call gad_dst3fl_adv_y( bi,bj,k, .true. ,deltatlev(k),
     $vtrans,vfld,masklocs,localtij,af,mythid )
              endif
              if (overlaponly .and. ipass .eq. 1) then
                call fill_cs_corner_tr_rl( 1, .false. ,localtij,bi,bj,
     $mythid )
              endif
            endif
            if (overlaponly) then
              jminupd = 1-oly+1
              jmaxupd = sny+oly-1
              if (s_edge) then
                jminupd = 1
              endif
              if (n_edge) then
                jmaxupd = sny
              endif
              if (w_edge) then
                do j = jminupd, jmaxupd
                  do i = 1-olx, 0
                    localtij(i,j) = localtij(i,j)-deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)*(af(i,j+1)-af(i,j)-tracer(i,j,k,bi,bj)
     $*(vtrans(i,j+1)-vtrans(i,j)))
                  end do
                end do
              endif
              if (e_edge) then
                do j = jminupd, jmaxupd
                  do i = snx+1, snx+olx
                    localtij(i,j) = localtij(i,j)-deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)*(af(i,j+1)-af(i,j)-tracer(i,j,k,bi,bj)
     $*(vtrans(i,j+1)-vtrans(i,j)))
                  end do
                end do
              endif
            else
              iminupd = 1-olx
              imaxupd = snx+olx
              if (interioronly .and. w_edge) then
                iminupd = 1
              endif
              if (interioronly .and. e_edge) then
                imaxupd = snx
              endif
              do j = 1-oly+1, sny+oly-1
                do i = iminupd, imaxupd
                  localtij(i,j) = localtij(i,j)-deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)*(af(i,j+1)-af(i,j)-tracer(i,j,k,bi,bj)
     $*(vtrans(i,j+1)-vtrans(i,j)))
                end do
              end do
            endif
          endif
        end do
        if (implicitadvection) then
        else
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              localtijk(i,j,k) = localtij(i,j)
            end do
          end do
        endif
      end do
      if ( .not. implicitadvection) then
        do k = 1, nr
          kkey = (igadkey-1)*nr+nr-k+1
          kup = 1+mod(k+1,2)
          kdown = 1+mod(k,2)
          kp1msk = 1.
          if (k .eq. nr) then
            kp1msk = 0.
          endif
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              rtrans(ip1,ip2) = comlev1_bibj_k_gad_rtrans_2h(ip1,ip2,
     $kkey)
            end do
          end do
          if (k .eq. 1) then
            do j = 1-oly, sny+oly
              do i = 1-olx, snx+olx
                rtranskp1(i,j) = kp1msk*rtrans(i,j)
                rtrans(i,j) = 0.
              end do
            end do
          else
            do j = 1-oly, sny+oly
              do i = 1-olx, snx+olx
                rtranskp1(i,j) = kp1msk*rtrans(i,j)
                rtrans(i,j) = wvel(i,j,k,bi,bj)*ra(i,j,bi,bj)*deepfac2f(
     $k)*rhofacf(k)*maskc(i,j,k-1,bi,bj)
              end do
            end do
          endif
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              adlocaltij(i,j) = adlocaltij(i,j)+adgtracer(i,j,k,bi,bj)/
     $deltatlev(k)
              adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)-adgtracer(i,
     $j,k,bi,bj)/deltatlev(k)
              adgtracer(i,j,k,bi,bj) = 0.d0
              adfvert(i,j,kdown) = adfvert(i,j,kdown)-adlocaltij(i,j)*
     $deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(
     $k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*rksign
              adfvert(i,j,kup) = adfvert(i,j,kup)+adlocaltij(i,j)*
     $deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(
     $k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*rksign
              adlocaltijk(i,j,k) = adlocaltijk(i,j,k)+adlocaltij(i,j)
              adrtrans(i,j) = adrtrans(i,j)-adlocaltij(i,j)*deltatlev(k)
     $*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(
     $i,j,bi,bj)*recip_deepfac2c(k)*tracer(i,j,k,bi,bj)*rksign
              adrtranskp1(i,j) = adrtranskp1(i,j)+adlocaltij(i,j)*
     $deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(
     $k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*tracer(i,j,k,bi,bj)*
     $rksign
              adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+adlocaltij(
     $i,j)*deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*
     $recip_drf(k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*(rtranskp1(i,
     $j)-rtrans(i,j))*rksign
              adlocaltij(i,j) = 0.d0
            end do
          end do
          if (k .eq. 1) then
            do j = 1-oly, sny+oly
              do i = 1-olx, snx+olx
                adfvert(i,j,kup) = 0.d0
                adrtrans(i,j) = 0.d0
                adwfld(i,j) = 0.d0
                adrtrans(i,j) = adrtrans(i,j)+adrtranskp1(i,j)*kp1msk
                adrtranskp1(i,j) = 0.d0
              end do
            end do
          else
            do j = 1-oly, sny+oly
              do i = 1-olx, snx+olx
                wfld(i,j) = wvel(i,j,k,bi,bj)
              end do
            end do
            if (vertadvecscheme .eq. enum_upwind_1rst .or. 
     $vertadvecscheme .eq. enum_dst2) then
              call adgad_dst2u1_adv_r( bi,bj,k,advectionscheme,
     $deltatlev(k),rtrans,adrtrans,wfld,adwfld,localtijk,adlocaltijk,
     $adfvert(1-olx,1-oly,kup) )
            else if (vertadvecscheme .eq. enum_flux_limit) then
              call adgad_fluxlimit_adv_r( bi,bj,k,deltatlev(k),rtrans,
     $adrtrans,wfld,adwfld,localtijk,adlocaltijk,adfvert(1-olx,1-oly,
     $kup) )
            else if (vertadvecscheme .eq. enum_dst3) then
              call adgad_dst3_adv_r( bi,bj,k,deltatlev(k),rtrans,
     $adrtrans,wfld,adwfld,localtijk,adlocaltijk,adfvert(1-olx,1-oly,
     $kup) )
            else if (vertadvecscheme .eq. enum_dst3_flux_limit) then
              call adgad_dst3fl_adv_r( bi,bj,k,deltatlev(k),rtrans,
     $adrtrans,wfld,adwfld,localtijk,adlocaltijk,adfvert(1-olx,1-oly,
     $kup) )
            endif
            do j = 1-oly, sny+oly
              do i = 1-olx, snx+olx
                adfvert(i,j,kup) = 0.d0
                adwvel(i,j,k,bi,bj) = adwvel(i,j,k,bi,bj)+adrtrans(i,j)*
     $ra(i,j,bi,bj)*deepfac2f(k)*rhofacf(k)*maskc(i,j,k-1,bi,bj)
                adrtrans(i,j) = 0.d0
                adwvel(i,j,k,bi,bj) = adwvel(i,j,k,bi,bj)+adwfld(i,j)
                adwfld(i,j) = 0.d0
                adrtrans(i,j) = adrtrans(i,j)+adrtranskp1(i,j)*kp1msk
                adrtranskp1(i,j) = 0.d0
              end do
            end do
          endif
        end do
      endif
      do k = nr, 1, -1
        kkey = (igadkey-1)*nr+k
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            tracer(ip1,ip2,k,bi,bj) = comlev1_bibj_k_gad_tracer_1h(ip1,
     $ip2,kkey)
          end do
        end do
        call calc_common_factors( uvel,vvel,ufld,vfld,utrans,vtrans,xa,
     $ya,k,bi,bj,mythid )
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            masklocw(i,j) = maskw(i,j,k,bi,bj)
            masklocs(i,j) = masks(i,j,k,bi,bj)
          end do
        end do
        if (usecubedsphereexchange) then
          withsigns =  .false. 
          call fill_cs_corner_uv_rs( withsigns,masklocw,masklocs,bi,bj,
     $mythid )
        endif
        if (implicitadvection) then
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              adlocaltij(i,j) = adlocaltij(i,j)+adgtracer(i,j,k,bi,bj)/
     $deltatlev(k)
              adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)-adgtracer(i,
     $j,k,bi,bj)/deltatlev(k)
              adgtracer(i,j,k,bi,bj) = 0.d0
            end do
          end do
        else
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              adlocaltij(i,j) = adlocaltij(i,j)+adlocaltijk(i,j,k)
              adlocaltijk(i,j,k) = 0.d0
            end do
          end do
        endif
        do ipass = npass, 1, -1
          passkey = ipass+(k-1)*maxpass+(igadkey-1)*maxpass*nr
          interioronly =  .false. 
          overlaponly =  .false. 
          if (usecubedsphereexchange) then
            if (ipass .eq. 1) then
              overlaponly = mod(ncface,3) .eq. 0
              interioronly = mod(ncface,3) .ne. 0
              calc_fluxes_x = ncface .eq. 6 .or. ncface .eq. 1 .or. 
     $ncface .eq. 2
              calc_fluxes_y = ncface .eq. 3 .or. ncface .eq. 4 .or. 
     $ncface .eq. 5
            else if (ipass .eq. 2) then
              overlaponly = mod(ncface,3) .eq. 2
              interioronly = mod(ncface,3) .eq. 1
              calc_fluxes_x = ncface .eq. 2 .or. ncface .eq. 3 .or. 
     $ncface .eq. 4
              calc_fluxes_y = ncface .eq. 5 .or. ncface .eq. 6 .or. 
     $ncface .eq. 1
            else
              interioronly =  .true. 
              calc_fluxes_x = ncface .eq. 5 .or. ncface .eq. 6
              calc_fluxes_y = ncface .eq. 2 .or. ncface .eq. 3
            endif
          else
            calc_fluxes_x = mod(ipass,2) .eq. 1
            calc_fluxes_y =  .not. calc_fluxes_x
          endif
          if (calc_fluxes_y) then
            if (overlaponly) then
              jminupd = 1-oly+1
              jmaxupd = sny+oly-1
              if (s_edge) then
                jminupd = 1
              endif
              if (n_edge) then
                jmaxupd = sny
              endif
              if (e_edge) then
                do j = jminupd, jmaxupd
                  do i = snx+1, snx+olx
                    adaf(i,j+1) = adaf(i,j+1)-adlocaltij(i,j)*deltatlev(
     $k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*
     $recip_ra(i,j,bi,bj)*recip_deepfac2c(k)
                    adaf(i,j) = adaf(i,j)+adlocaltij(i,j)*deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)
                    adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+
     $adlocaltij(i,j)*deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,
     $bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*(
     $vtrans(i,j+1)-vtrans(i,j))
                    advtrans(i,j+1) = advtrans(i,j+1)+adlocaltij(i,j)*
     $deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(
     $k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*tracer(i,j,k,bi,bj)
                    advtrans(i,j) = advtrans(i,j)-adlocaltij(i,j)*
     $deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(
     $k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*tracer(i,j,k,bi,bj)
                  end do
                end do
              endif
              if (w_edge) then
                do j = jminupd, jmaxupd
                  do i = 1-olx, 0
                    adaf(i,j+1) = adaf(i,j+1)-adlocaltij(i,j)*deltatlev(
     $k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*
     $recip_ra(i,j,bi,bj)*recip_deepfac2c(k)
                    adaf(i,j) = adaf(i,j)+adlocaltij(i,j)*deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)
                    adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+
     $adlocaltij(i,j)*deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,
     $bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*(
     $vtrans(i,j+1)-vtrans(i,j))
                    advtrans(i,j+1) = advtrans(i,j+1)+adlocaltij(i,j)*
     $deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(
     $k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*tracer(i,j,k,bi,bj)
                    advtrans(i,j) = advtrans(i,j)-adlocaltij(i,j)*
     $deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(
     $k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*tracer(i,j,k,bi,bj)
                  end do
                end do
              endif
            else
              iminupd = 1-olx
              imaxupd = snx+olx
              if (interioronly .and. w_edge) then
                iminupd = 1
              endif
              if (interioronly .and. e_edge) then
                imaxupd = snx
              endif
              do j = 1-oly+1, sny+oly-1
                do i = iminupd, imaxupd
                  adaf(i,j+1) = adaf(i,j+1)-adlocaltij(i,j)*deltatlev(k)
     $*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(
     $i,j,bi,bj)*recip_deepfac2c(k)
                  adaf(i,j) = adaf(i,j)+adlocaltij(i,j)*deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)
                  adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+
     $adlocaltij(i,j)*deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,
     $bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*(
     $vtrans(i,j+1)-vtrans(i,j))
                  advtrans(i,j+1) = advtrans(i,j+1)+adlocaltij(i,j)*
     $deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(
     $k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*tracer(i,j,k,bi,bj)
                  advtrans(i,j) = advtrans(i,j)-adlocaltij(i,j)*
     $deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(
     $k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*tracer(i,j,k,bi,bj)
                end do
              end do
            endif
            if (( .not. overlaponly) .or. e_edge .or. w_edge) then
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  localtij(ip1,ip2) = comlev1_bibj_k_gad_pass_localti(
     $ip1,ip2,passkey)
                end do
              end do
              if (overlaponly .and. ipass .eq. 1) then
                call adfill_cs_corner_tr_rl( 1, .false. ,adlocaltij )
              endif
              if (advectionscheme .eq. enum_upwind_1rst .or. 
     $advectionscheme .eq. enum_dst2) then
                call adgad_dst2u1_adv_y( bi,bj,k,advectionscheme, 
     $.true. ,deltatlev(k),vtrans,advtrans,vfld,advfld,localtij,
     $adlocaltij,adaf )
              else if (advectionscheme .eq. enum_flux_limit) then
                call adgad_fluxlimit_adv_y( bi,bj,k, .true. ,deltatlev(
     $k),vtrans,advtrans,vfld,advfld,masklocs,localtij,adlocaltij,adaf )
              else if (advectionscheme .eq. enum_dst3) then
                call adgad_dst3_adv_y( bi,bj,k, .true. ,deltatlev(k),
     $vtrans,advtrans,vfld,advfld,masklocs,localtij,adlocaltij,adaf )
              else if (advectionscheme .eq. enum_dst3_flux_limit) then
                call adgad_dst3fl_adv_y( bi,bj,k, .true. ,deltatlev(k),
     $vtrans,advtrans,vfld,advfld,masklocs,localtij,adlocaltij,adaf )
              endif
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  adaf(i,j) = 0.d0
                end do
              end do
              if (overlaponly) then
                call adfill_cs_corner_tr_rl( 2, .false. ,adlocaltij )
              endif
            endif
          endif
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              adaf(i,j) = 0.d0
            end do
          end do
          if (calc_fluxes_x) then
            if (overlaponly) then
              iminupd = 1-olx+1
              imaxupd = snx+olx-1
              if (w_edge) then
                iminupd = 1
              endif
              if (e_edge) then
                imaxupd = snx
              endif
              if (n_edge) then
                do j = sny+1, sny+oly
                  do i = iminupd, imaxupd
                    adaf(i+1,j) = adaf(i+1,j)-adlocaltij(i,j)*deltatlev(
     $k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*
     $recip_ra(i,j,bi,bj)*recip_deepfac2c(k)
                    adaf(i,j) = adaf(i,j)+adlocaltij(i,j)*deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)
                    adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+
     $adlocaltij(i,j)*deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,
     $bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*(
     $utrans(i+1,j)-utrans(i,j))
                    adutrans(i+1,j) = adutrans(i+1,j)+adlocaltij(i,j)*
     $deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(
     $k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*tracer(i,j,k,bi,bj)
                    adutrans(i,j) = adutrans(i,j)-adlocaltij(i,j)*
     $deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(
     $k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*tracer(i,j,k,bi,bj)
                  end do
                end do
              endif
              if (s_edge) then
                do j = 1-oly, 0
                  do i = iminupd, imaxupd
                    adaf(i+1,j) = adaf(i+1,j)-adlocaltij(i,j)*deltatlev(
     $k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*
     $recip_ra(i,j,bi,bj)*recip_deepfac2c(k)
                    adaf(i,j) = adaf(i,j)+adlocaltij(i,j)*deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)
                    adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+
     $adlocaltij(i,j)*deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,
     $bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*(
     $utrans(i+1,j)-utrans(i,j))
                    adutrans(i+1,j) = adutrans(i+1,j)+adlocaltij(i,j)*
     $deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(
     $k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*tracer(i,j,k,bi,bj)
                    adutrans(i,j) = adutrans(i,j)-adlocaltij(i,j)*
     $deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(
     $k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*tracer(i,j,k,bi,bj)
                  end do
                end do
              endif
            else
              jminupd = 1-oly
              jmaxupd = sny+oly
              if (interioronly .and. s_edge) then
                jminupd = 1
              endif
              if (interioronly .and. n_edge) then
                jmaxupd = sny
              endif
              do j = jminupd, jmaxupd
                do i = 1-olx+1, snx+olx-1
                  adaf(i+1,j) = adaf(i+1,j)-adlocaltij(i,j)*deltatlev(k)
     $*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(
     $i,j,bi,bj)*recip_deepfac2c(k)
                  adaf(i,j) = adaf(i,j)+adlocaltij(i,j)*deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)
                  adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+
     $adlocaltij(i,j)*deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,
     $bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*(
     $utrans(i+1,j)-utrans(i,j))
                  adutrans(i+1,j) = adutrans(i+1,j)+adlocaltij(i,j)*
     $deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(
     $k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*tracer(i,j,k,bi,bj)
                  adutrans(i,j) = adutrans(i,j)-adlocaltij(i,j)*
     $deltatlev(k)*recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(
     $k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*tracer(i,j,k,bi,bj)
                end do
              end do
            endif
            if (( .not. overlaponly) .or. n_edge .or. s_edge) then
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  localtij(ip1,ip2) = comlev1_bibj_k_gad_pass_localtj(
     $ip1,ip2,passkey)
                end do
              end do
              if (overlaponly .and. ipass .eq. 1) then
                call adfill_cs_corner_tr_rl( 2, .false. ,adlocaltij )
              endif
              if (advectionscheme .eq. enum_upwind_1rst .or. 
     $advectionscheme .eq. enum_dst2) then
                call adgad_dst2u1_adv_x( bi,bj,k,advectionscheme, 
     $.true. ,deltatlev(k),utrans,adutrans,ufld,adufld,localtij,
     $adlocaltij,adaf )
              else if (advectionscheme .eq. enum_flux_limit) then
                call adgad_fluxlimit_adv_x( bi,bj,k, .true. ,deltatlev(
     $k),utrans,adutrans,ufld,adufld,masklocw,localtij,adlocaltij,adaf )
              else if (advectionscheme .eq. enum_dst3) then
                call adgad_dst3_adv_x( bi,bj,k, .true. ,deltatlev(k),
     $utrans,adutrans,ufld,adufld,masklocw,localtij,adlocaltij,adaf )
              else if (advectionscheme .eq. enum_dst3_flux_limit) then
                call adgad_dst3fl_adv_x( bi,bj,k, .true. ,deltatlev(k),
     $utrans,adutrans,ufld,adufld,masklocw,localtij,adlocaltij,adaf )
              endif
              if (overlaponly) then
                call adfill_cs_corner_tr_rl( 1, .false. ,adlocaltij )
              endif
            endif
          endif
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              adaf(i,j) = 0.d0
            end do
          end do
        end do
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+adlocaltij(i,
     $j)
            adlocaltij(i,j) = 0.d0
          end do
        end do
        call adcalc_common_factors( aduvel,advvel,adufld,advfld,
     $adutrans,advtrans,k,bi,bj )
      end do

      end

      subroutine mdgad_advection( implicitadvection, advectionscheme, 
     $vertadvecscheme, traceridentity, deltatlev, uvel, vvel, wvel, 
     $tracer, gtracer, bi, bj, mytime, myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer enum_dst2
      parameter ( enum_dst2 = 20 )
      integer enum_dst3
      parameter ( enum_dst3 = 30 )
      integer enum_dst3_flux_limit
      parameter ( enum_dst3_flux_limit = 33 )
      integer enum_flux_limit
      parameter ( enum_flux_limit = 77 )
      integer enum_upwind_1rst
      parameter ( enum_upwind_1rst = 1 )
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer maxpass
      parameter ( maxpass = 2 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      real*8 comlev1_bibj_k_gad_pass_af_5h(1-olx:snx+olx,1-oly:sny+oly,
     $7200)
      common /cadaf/ comlev1_bibj_k_gad_pass_af_5h

      real*8 comlev1_bibj_k_gad_pass_af_2h(1-olx:snx+olx,1-oly:sny+oly,
     $7200)
      common /cadag/ comlev1_bibj_k_gad_pass_af_2h

      real*8 comlev1_bibj_k_gad_fvert_3h(1-olx:snx+olx,1-oly:sny+oly,2,
     $3600)
      common /cadfvert/ comlev1_bibj_k_gad_fvert_3h

      real*8 comlev1_bibj_k_gad_pass_localti(1-olx:snx+olx,1-oly:sny+
     $oly,7200)
      common /cadlocaltij/ comlev1_bibj_k_gad_pass_localti

      real*8 comlev1_bibj_k_gad_pass_localtk(1-olx:snx+olx,1-oly:sny+
     $oly,7200)
      common /cadlocaltik/ comlev1_bibj_k_gad_pass_localtk

      real*8 comlev1_bibj_k_gad_pass_localtj(1-olx:snx+olx,1-oly:sny+
     $oly,7200)
      common /cadlocaltil/ comlev1_bibj_k_gad_pass_localtj

      real*8 comlev1_bibj_k_gad_pass_localtl(1-olx:snx+olx,1-oly:sny+
     $oly,7200)
      common /cadlocaltim/ comlev1_bibj_k_gad_pass_localtl

      real*8 comlev1_bibj_k_gad_rtrans_2h(1-olx:snx+olx,1-oly:sny+oly,
     $3600)
      common /cadrtrant/ comlev1_bibj_k_gad_rtrans_2h

      real*8 comlev1_bibj_k_gad_tracer_1h(1-olx:snx+olx,1-oly:sny+oly,
     $3600)
      common /cadtracer/ comlev1_bibj_k_gad_tracer_1h

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      integer advectionscheme
      integer bi
      integer bj
      double precision deltatlev(nr)
      double precision gtracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      logical implicitadvection
      integer myiter
      integer mythid
      double precision mytime
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer traceridentity
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer vertadvecscheme
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)

C==============================================
C declare local variables
C==============================================
      integer act0
      integer act1
      integer act2
      integer act3
      integer act4
      double precision af(1-olx:snx+olx,1-oly:sny+oly)
      logical calc_fluxes_x
      logical calc_fluxes_y
      logical e_edge
      double precision fvert(1-olx:snx+olx,1-oly:sny+oly,2)
      integer i
      integer igadkey
      integer imaxupd
      integer iminupd
      logical interioronly
      integer ipass
      integer iqf
      integer iqg
      integer iqh
      integer iqi
      integer iqj
      integer irm
      integer irn
      integer iro
      integer irp
      integer irq
      integer irr
      integer irs
      integer irt
      integer iru
      integer irv
      integer irw
      integer irx
      integer iry
      integer irz
      integer j
      integer jmaxupd
      integer jminupd
      integer k
      integer kdown
      integer kkey
      double precision kp1msk
      integer kup
      double precision localtij(1-olx:snx+olx,1-oly:sny+oly)
      double precision localtijk(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision masklocs(1-olx:snx+olx,1-oly:sny+oly)
      double precision masklocw(1-olx:snx+olx,1-oly:sny+oly)
      integer max0
      integer max1
      integer max2
      integer max3
      logical n_edge
      integer ncface
      integer npass
      logical overlaponly
      integer passkey
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision rtranskp1(1-olx:snx+olx,1-oly:sny+oly)
      logical s_edge
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)
      logical w_edge
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly)
      logical withsigns
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C**********************************************
C executable statements of routine
C**********************************************
      act0 = traceridentity
      max0 = maxpass
      act1 = bi-mybxlo(mythid)
      max1 = mybxhi(mythid)-mybxlo(mythid)+1
      act2 = bj-mybylo(mythid)
      max2 = mybyhi(mythid)-mybylo(mythid)+1
      act3 = mythid-1
      max3 = ntx*nty
      act4 = ikey_dynamics-1
      igadkey = act0+act1*max0+act2*max0*max1+act3*max0*max1*max2+act4*
     $max0*max1*max2*max3
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          rtrans(i,j) = 0.d0
          fvert(i,j,1) = 0.d0
          fvert(i,j,2) = 0.d0
          rtranskp1(i,j) = 0.d0
          localtij(i,j) = 0.d0
          wfld(i,j) = 0.d0
        end do
      end do
      if (usecubedsphereexchange) then
        npass = 3
        ncface = bi
        n_edge =  .true. 
        s_edge =  .true. 
        e_edge =  .true. 
        w_edge =  .true. 
      else
        npass = 2
        ncface = 0
        n_edge =  .false. 
        s_edge =  .false. 
        e_edge =  .false. 
        w_edge =  .false. 
      endif
      do k = 1, nr
        kkey = (igadkey-1)*nr+k
        do irz = 1-oly, sny+oly
          do iry = 1-olx, snx+olx
            comlev1_bibj_k_gad_tracer_1h(iry,irz,kkey) = tracer(iry,irz,
     $k,bi,bj)
          end do
        end do
        call calc_common_factors( uvel,vvel,ufld,vfld,utrans,vtrans,xa,
     $ya,k,bi,bj,mythid )
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            localtij(i,j) = tracer(i,j,k,bi,bj)
            masklocw(i,j) = maskw(i,j,k,bi,bj)
            masklocs(i,j) = masks(i,j,k,bi,bj)
          end do
        end do
        if (usecubedsphereexchange) then
          withsigns =  .false. 
          call fill_cs_corner_uv_rs( withsigns,masklocw,masklocs,bi,bj,
     $mythid )
        endif
        do ipass = 1, npass
          passkey = ipass+(k-1)*maxpass+(igadkey-1)*maxpass*nr
          interioronly =  .false. 
          overlaponly =  .false. 
          if (usecubedsphereexchange) then
            if (ipass .eq. 1) then
              overlaponly = mod(ncface,3) .eq. 0
              interioronly = mod(ncface,3) .ne. 0
              calc_fluxes_x = ncface .eq. 6 .or. ncface .eq. 1 .or. 
     $ncface .eq. 2
              calc_fluxes_y = ncface .eq. 3 .or. ncface .eq. 4 .or. 
     $ncface .eq. 5
            else if (ipass .eq. 2) then
              overlaponly = mod(ncface,3) .eq. 2
              interioronly = mod(ncface,3) .eq. 1
              calc_fluxes_x = ncface .eq. 2 .or. ncface .eq. 3 .or. 
     $ncface .eq. 4
              calc_fluxes_y = ncface .eq. 5 .or. ncface .eq. 6 .or. 
     $ncface .eq. 1
            else
              interioronly =  .true. 
              calc_fluxes_x = ncface .eq. 5 .or. ncface .eq. 6
              calc_fluxes_y = ncface .eq. 2 .or. ncface .eq. 3
            endif
          else
            calc_fluxes_x = mod(ipass,2) .eq. 1
            calc_fluxes_y =  .not. calc_fluxes_x
          endif
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              af(i,j) = 0.
            end do
          end do
          do irx = 1-oly, sny+oly
            do irw = 1-olx, snx+olx
              comlev1_bibj_k_gad_pass_localtl(irw,irx,passkey) = 
     $localtij(irw,irx)
            end do
          end do
          do irv = 1-oly, sny+oly
            do iru = 1-olx, snx+olx
              comlev1_bibj_k_gad_pass_af_2h(iru,irv,passkey) = af(iru,
     $irv)
            end do
          end do
          if (calc_fluxes_x) then
            if (( .not. overlaponly) .or. n_edge .or. s_edge) then
              if (overlaponly) then
                call fill_cs_corner_tr_rl( 1, .false. ,localtij,bi,bj,
     $mythid )
              endif
              do irt = 1-oly, sny+oly
                do irs = 1-olx, snx+olx
                  comlev1_bibj_k_gad_pass_localtk(irs,irt,passkey) = 
     $localtij(irs,irt)
                end do
              end do
              if (advectionscheme .eq. enum_upwind_1rst .or. 
     $advectionscheme .eq. enum_dst2) then
                call gad_dst2u1_adv_x( bi,bj,k,advectionscheme, .true. ,
     $deltatlev(k),utrans,ufld,localtij,af,mythid )
              else if (advectionscheme .eq. enum_flux_limit) then
                call gad_fluxlimit_adv_x( bi,bj,k, .true. ,deltatlev(k),
     $utrans,ufld,masklocw,localtij,af,mythid )
              else if (advectionscheme .eq. enum_dst3) then
                call gad_dst3_adv_x( bi,bj,k, .true. ,deltatlev(k),
     $utrans,ufld,masklocw,localtij,af,mythid )
              else if (advectionscheme .eq. enum_dst3_flux_limit) then
                call gad_dst3fl_adv_x( bi,bj,k, .true. ,deltatlev(k),
     $utrans,ufld,masklocw,localtij,af,mythid )
              endif
              if (overlaponly .and. ipass .eq. 1) then
                call fill_cs_corner_tr_rl( 2, .false. ,localtij,bi,bj,
     $mythid )
              endif
            endif
            if (overlaponly) then
              iminupd = 1-olx+1
              imaxupd = snx+olx-1
              if (w_edge) then
                iminupd = 1
              endif
              if (e_edge) then
                imaxupd = snx
              endif
              if (s_edge) then
                do j = 1-oly, 0
                  do i = iminupd, imaxupd
                    localtij(i,j) = localtij(i,j)-deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)*(af(i+1,j)-af(i,j)-tracer(i,j,k,bi,bj)
     $*(utrans(i+1,j)-utrans(i,j)))
                  end do
                end do
              endif
              if (n_edge) then
                do j = sny+1, sny+oly
                  do i = iminupd, imaxupd
                    localtij(i,j) = localtij(i,j)-deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)*(af(i+1,j)-af(i,j)-tracer(i,j,k,bi,bj)
     $*(utrans(i+1,j)-utrans(i,j)))
                  end do
                end do
              endif
            else
              jminupd = 1-oly
              jmaxupd = sny+oly
              if (interioronly .and. s_edge) then
                jminupd = 1
              endif
              if (interioronly .and. n_edge) then
                jmaxupd = sny
              endif
              do j = jminupd, jmaxupd
                do i = 1-olx+1, snx+olx-1
                  localtij(i,j) = localtij(i,j)-deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)*(af(i+1,j)-af(i,j)-tracer(i,j,k,bi,bj)
     $*(utrans(i+1,j)-utrans(i,j)))
                end do
              end do
            endif
          endif
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              af(i,j) = 0.
            end do
          end do
          do irr = 1-oly, sny+oly
            do irq = 1-olx, snx+olx
              comlev1_bibj_k_gad_pass_localtj(irq,irr,passkey) = 
     $localtij(irq,irr)
            end do
          end do
          do irp = 1-oly, sny+oly
            do iro = 1-olx, snx+olx
              comlev1_bibj_k_gad_pass_af_5h(iro,irp,passkey) = af(iro,
     $irp)
            end do
          end do
          if (calc_fluxes_y) then
            if (( .not. overlaponly) .or. e_edge .or. w_edge) then
              if (overlaponly) then
                call fill_cs_corner_tr_rl( 2, .false. ,localtij,bi,bj,
     $mythid )
              endif
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  af(i,j) = 0.
                end do
              end do
              do irn = 1-oly, sny+oly
                do irm = 1-olx, snx+olx
                  comlev1_bibj_k_gad_pass_localti(irm,irn,passkey) = 
     $localtij(irm,irn)
                end do
              end do
              if (advectionscheme .eq. enum_upwind_1rst .or. 
     $advectionscheme .eq. enum_dst2) then
                call gad_dst2u1_adv_y( bi,bj,k,advectionscheme, .true. ,
     $deltatlev(k),vtrans,vfld,localtij,af,mythid )
              else if (advectionscheme .eq. enum_flux_limit) then
                call gad_fluxlimit_adv_y( bi,bj,k, .true. ,deltatlev(k),
     $vtrans,vfld,masklocs,localtij,af,mythid )
              else if (advectionscheme .eq. enum_dst3) then
                call gad_dst3_adv_y( bi,bj,k, .true. ,deltatlev(k),
     $vtrans,vfld,masklocs,localtij,af,mythid )
              else if (advectionscheme .eq. enum_dst3_flux_limit) then
                call gad_dst3fl_adv_y( bi,bj,k, .true. ,deltatlev(k),
     $vtrans,vfld,masklocs,localtij,af,mythid )
              endif
              if (overlaponly .and. ipass .eq. 1) then
                call fill_cs_corner_tr_rl( 1, .false. ,localtij,bi,bj,
     $mythid )
              endif
            endif
            if (overlaponly) then
              jminupd = 1-oly+1
              jmaxupd = sny+oly-1
              if (s_edge) then
                jminupd = 1
              endif
              if (n_edge) then
                jmaxupd = sny
              endif
              if (w_edge) then
                do j = jminupd, jmaxupd
                  do i = 1-olx, 0
                    localtij(i,j) = localtij(i,j)-deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)*(af(i,j+1)-af(i,j)-tracer(i,j,k,bi,bj)
     $*(vtrans(i,j+1)-vtrans(i,j)))
                  end do
                end do
              endif
              if (e_edge) then
                do j = jminupd, jmaxupd
                  do i = snx+1, snx+olx
                    localtij(i,j) = localtij(i,j)-deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)*(af(i,j+1)-af(i,j)-tracer(i,j,k,bi,bj)
     $*(vtrans(i,j+1)-vtrans(i,j)))
                  end do
                end do
              endif
            else
              iminupd = 1-olx
              imaxupd = snx+olx
              if (interioronly .and. w_edge) then
                iminupd = 1
              endif
              if (interioronly .and. e_edge) then
                imaxupd = snx
              endif
              do j = 1-oly+1, sny+oly-1
                do i = iminupd, imaxupd
                  localtij(i,j) = localtij(i,j)-deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)*(af(i,j+1)-af(i,j)-tracer(i,j,k,bi,bj)
     $*(vtrans(i,j+1)-vtrans(i,j)))
                end do
              end do
            endif
          endif
        end do
        if (implicitadvection) then
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              gtracer(i,j,k,bi,bj) = (localtij(i,j)-tracer(i,j,k,bi,bj))
     $/deltatlev(k)
            end do
          end do
        else
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              localtijk(i,j,k) = localtij(i,j)
            end do
          end do
        endif
      end do
      if ( .not. implicitadvection) then
        do k = nr, 1, -1
          kkey = (igadkey-1)*nr+nr-k+1
          kup = 1+mod(k+1,2)
          kdown = 1+mod(k,2)
          kp1msk = 1.
          if (k .eq. nr) then
            kp1msk = 0.
          endif
          do iqj = 1-oly, sny+oly
            do iqi = 1-olx, snx+olx
              comlev1_bibj_k_gad_rtrans_2h(iqi,iqj,kkey) = rtrans(iqi,
     $iqj)
            end do
          end do
          if (k .eq. 1) then
            do j = 1-oly, sny+oly
              do i = 1-olx, snx+olx
                rtranskp1(i,j) = kp1msk*rtrans(i,j)
                wfld(i,j) = 0.
                rtrans(i,j) = 0.
                fvert(i,j,kup) = 0.
              end do
            end do
          else
            do j = 1-oly, sny+oly
              do i = 1-olx, snx+olx
                rtranskp1(i,j) = kp1msk*rtrans(i,j)
                wfld(i,j) = wvel(i,j,k,bi,bj)
                rtrans(i,j) = wvel(i,j,k,bi,bj)*ra(i,j,bi,bj)*deepfac2f(
     $k)*rhofacf(k)*maskc(i,j,k-1,bi,bj)
                fvert(i,j,kup) = 0.
              end do
            end do
            if (vertadvecscheme .eq. enum_upwind_1rst .or. 
     $vertadvecscheme .eq. enum_dst2) then
              call gad_dst2u1_adv_r( bi,bj,k,advectionscheme,deltatlev(
     $k),rtrans,wfld,localtijk,fvert(1-olx,1-oly,kup),mythid )
            else if (vertadvecscheme .eq. enum_flux_limit) then
              call gad_fluxlimit_adv_r( bi,bj,k,deltatlev(k),rtrans,
     $wfld,localtijk,fvert(1-olx,1-oly,kup),mythid )
            else if (vertadvecscheme .eq. enum_dst3) then
              call gad_dst3_adv_r( bi,bj,k,deltatlev(k),rtrans,wfld,
     $localtijk,fvert(1-olx,1-oly,kup),mythid )
            else if (vertadvecscheme .eq. enum_dst3_flux_limit) then
              call gad_dst3fl_adv_r( bi,bj,k,deltatlev(k),rtrans,wfld,
     $localtijk,fvert(1-olx,1-oly,kup),mythid )
            endif
          endif
          do iqh = 1, 2
            do iqg = 1-oly, sny+oly
              do iqf = 1-olx, snx+olx
                comlev1_bibj_k_gad_fvert_3h(iqf,iqg,iqh,kkey) = fvert(
     $iqf,iqg,iqh)
              end do
            end do
          end do
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              localtij(i,j) = localtijk(i,j,k)-deltatlev(k)*
     $recip_rhofacc(k)*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,
     $j,bi,bj)*recip_deepfac2c(k)*(fvert(i,j,kdown)-fvert(i,j,kup)-
     $tracer(i,j,k,bi,bj)*(rtranskp1(i,j)-rtrans(i,j)))*rksign
              gtracer(i,j,k,bi,bj) = (localtij(i,j)-tracer(i,j,k,bi,bj))
     $/deltatlev(k)
            end do
          end do
        end do
      endif
      end

      subroutine adgad_biharm_x( bi, bj, k, xa, addel2t, diffk4, addfx )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision addel2t(1-olx:snx+olx,1-oly:sny+oly)
      double precision addfx(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision diffk4
      integer k
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly, sny+oly
        do i = 1-olx+1, snx+olx
          addel2t(i-1,j) = addel2t(i-1,j)-addfx(i,j)*diffk4*xa(i,j)*
     $recip_dxc(i,j,bi,bj)*recip_deepfacc(k)*sqcosfacu(j,bi,bj)
          addel2t(i,j) = addel2t(i,j)+addfx(i,j)*diffk4*xa(i,j)*
     $recip_dxc(i,j,bi,bj)*recip_deepfacc(k)*sqcosfacu(j,bi,bj)
        end do
      end do

      end

      subroutine adgad_biharm_y( bi, bj, k, ya, addel2t, diffk4, addfy )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision addel2t(1-olx:snx+olx,1-oly:sny+oly)
      double precision addfy(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision diffk4
      integer k
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly+1, sny+oly
        do i = 1-olx, snx+olx
          addel2t(i,j-1) = addel2t(i,j-1)-addfy(i,j)*diffk4*ya(i,j)*
     $recip_dyc(i,j,bi,bj)*recip_deepfacc(k)
          addel2t(i,j) = addel2t(i,j)+addfy(i,j)*diffk4*ya(i,j)*
     $recip_dyc(i,j,bi,bj)*recip_deepfacc(k)
        end do
      end do

      end

      subroutine adgad_c2_adv_r( bi, bj, k, rtrans, adrtrans, tracer, 
     $adtracer, adwt )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adrtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwt(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      integer km1

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      km1 = max(1,k-1)
      if (k .eq. 1 .or. k .gt. nr) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adwt(i,j) = 0.d0
          end do
        end do
      else
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adrtrans(i,j) = adrtrans(i,j)+0.5d0*adwt(i,j)*maskc(i,j,km1,
     $bi,bj)*(tracer(i,j,k,bi,bj)+tracer(i,j,km1,bi,bj))
            adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+0.5d0*adwt(i,
     $j)*maskc(i,j,km1,bi,bj)*rtrans(i,j)
            adtracer(i,j,km1,bi,bj) = adtracer(i,j,km1,bi,bj)+0.5d0*
     $adwt(i,j)*maskc(i,j,km1,bi,bj)*rtrans(i,j)
            adwt(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine adgad_c2_adv_x( utrans, adutrans, tracer, adtracer, 
     $adut )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
C==============================================
C declare arguments
C==============================================
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision adut(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly, sny+oly
        do i = 1-olx+1, snx+olx
          adtracer(i-1,j) = adtracer(i-1,j)+0.5d0*adut(i,j)*utrans(i,j)
          adtracer(i,j) = adtracer(i,j)+0.5d0*adut(i,j)*utrans(i,j)
          adutrans(i,j) = adutrans(i,j)+0.5d0*adut(i,j)*(tracer(i,j)+
     $tracer(i-1,j))
          adut(i,j) = 0.d0
        end do
      end do

      end

      subroutine adgad_c2_adv_y( vtrans, advtrans, tracer, adtracer, 
     $advt )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
C==============================================
C declare arguments
C==============================================
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision advt(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly+1, sny+oly
        do i = 1-olx, snx+olx
          adtracer(i,j-1) = adtracer(i,j-1)+0.5d0*advt(i,j)*vtrans(i,j)
          adtracer(i,j) = adtracer(i,j)+0.5d0*advt(i,j)*vtrans(i,j)
          advtrans(i,j) = advtrans(i,j)+0.5d0*advt(i,j)*(tracer(i,j)+
     $tracer(i,j-1))
          advt(i,j) = 0.d0
        end do
      end do
      do i = 1-olx, snx+olx
        advt(i,1-oly) = 0.d0
      end do

      end

      subroutine adgad_c4_adv_r( bi, bj, k, rtrans, adrtrans, tracer, 
     $adtracer, adwt )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision onesixth
      parameter ( onesixth = 1.d0/6.d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adrtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwt(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)

C==============================================
C declare local variables
C==============================================
      double precision adrj
      double precision adrjjm
      double precision adrjjp
      double precision adrjm
      double precision adrjp
      double precision adwth
      integer i
      integer j
      integer km1
      integer km2
      integer kp1
      double precision maskbound
      double precision maskpm
      double precision rj
      double precision rjjm
      double precision rjjp
      double precision rjm
      double precision rjp
      double precision wth

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adrj = 0.d0
      adrjjm = 0.d0
      adrjjp = 0.d0
      adrjm = 0.d0
      adrjp = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      km2 = max(1,k-2)
      km1 = max(1,k-1)
      kp1 = min(nr,k+1)
      maskpm = 1.
      if (k .le. 2 .or. k .ge. nr) then
        maskpm = 0.
      endif
      if (k .eq. 1 .or. k .gt. nr) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adwt(i,j) = 0.d0
          end do
        end do
      else
        do j = sny+oly, 1-oly, -1
          adrj = 0.d0
          adrjjm = 0.d0
          adrjjp = 0.d0
          adrjm = 0.d0
          adrjp = 0.d0
          do i = snx+olx, 1-olx, -1
            adrj = 0.d0
            adrjjm = 0.d0
            adrjjp = 0.d0
            adrjm = 0.d0
            adrjp = 0.d0
            maskbound = maskpm*maskc(i,j,km2,bi,bj)*maskc(i,j,kp1,bi,bj)
            rjp = (tracer(i,j,kp1,bi,bj)-tracer(i,j,k,bi,bj))*maskc(i,j,
     $kp1,bi,bj)
            rj = tracer(i,j,k,bi,bj)-tracer(i,j,km1,bi,bj)
            rjm = (tracer(i,j,km1,bi,bj)-tracer(i,j,km2,bi,bj))*maskc(i,
     $j,km1,bi,bj)
            rjjp = rjp-rj
            rjjm = rj-rjm
            wth = abs(rtrans(i,j))
            adrjjm = adrjjm+adwt(i,j)*maskc(i,j,km1,bi,bj)*((-(0.5d0*
     $rtrans(i,j)*onesixth))+0.5d0*wth*onesixth*(1.d0-maskbound))
            adrjjp = adrjjp+adwt(i,j)*maskc(i,j,km1,bi,bj)*((-(0.5d0*
     $rtrans(i,j)*onesixth))-0.5d0*wth*onesixth*(1.d0-maskbound))
            adrtrans(i,j) = adrtrans(i,j)+adwt(i,j)*maskc(i,j,km1,bi,bj)
     $*(0.5d0*(tracer(i,j,k,bi,bj)+tracer(i,j,km1,bi,bj))-0.5d0*
     $onesixth*(rjjm+rjjp))
            adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+0.5d0*adwt(i,
     $j)*maskc(i,j,km1,bi,bj)*rtrans(i,j)
            adtracer(i,j,km1,bi,bj) = adtracer(i,j,km1,bi,bj)+0.5d0*
     $adwt(i,j)*maskc(i,j,km1,bi,bj)*rtrans(i,j)
            adwth = 0.5d0*adwt(i,j)*maskc(i,j,km1,bi,bj)*onesixth*(rjjm-
     $rjjp)*(1.d0-maskbound)
            adrtrans(i,j) = adrtrans(i,j)+adwth*sign(1.d0,rtrans(i,j))
            adwt(i,j) = 0.d0
            adrj = adrj+adrjjm
            adrjm = adrjm-adrjjm
            adrjjm = 0.d0
            adrj = adrj-adrjjp
            adrjp = adrjp+adrjjp
            adrjjp = 0.d0
            adtracer(i,j,km1,bi,bj) = adtracer(i,j,km1,bi,bj)+adrjm*
     $maskc(i,j,km1,bi,bj)
            adtracer(i,j,km2,bi,bj) = adtracer(i,j,km2,bi,bj)-adrjm*
     $maskc(i,j,km1,bi,bj)
            adrjm = 0.d0
            adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+adrj
            adtracer(i,j,km1,bi,bj) = adtracer(i,j,km1,bi,bj)-adrj
            adrj = 0.d0
            adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)-adrjp*maskc(i,
     $j,kp1,bi,bj)
            adtracer(i,j,kp1,bi,bj) = adtracer(i,j,kp1,bi,bj)+adrjp*
     $maskc(i,j,kp1,bi,bj)
            adrjp = 0.d0
          end do
        end do
      endif

      end

      subroutine adgad_c4_adv_x( bi, bj, k, utrans, adutrans, tracer, 
     $adtracer, adut )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision onesixth
      parameter ( onesixth = 1.d0/6.d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision adut(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adrj
      double precision adrjjm
      double precision adrjjp
      double precision adrjm
      double precision adrjp
      double precision aduth
      integer i
      integer j
      double precision rj
      double precision rjjm
      double precision rjjp
      double precision rjm
      double precision rjp
      double precision uth

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adrj = 0.d0
      adrjjm = 0.d0
      adrjjp = 0.d0
      adrjm = 0.d0
      adrjp = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = sny+oly, 1-oly, -1
        adrj = 0.d0
        adrjjm = 0.d0
        adrjjp = 0.d0
        adrjm = 0.d0
        adrjp = 0.d0
        do i = snx+olx-1, 1-olx+2, -1
          adrj = 0.d0
          adrjjm = 0.d0
          adrjjp = 0.d0
          adrjm = 0.d0
          adrjp = 0.d0
          rjp = (tracer(i+1,j)-tracer(i,j))*maskw(i+1,j,k,bi,bj)
          rj = (tracer(i,j)-tracer(i-1,j))*maskw(i,j,k,bi,bj)
          rjm = (tracer(i-1,j)-tracer(i-2,j))*maskw(i-1,j,k,bi,bj)
          rjjp = rjp-rj
          rjjm = rj-rjm
          uth = abs(utrans(i,j))
          adrjjm = adrjjm+adut(i,j)*((-(0.5d0*utrans(i,j)*onesixth))-
     $0.5d0*uth*onesixth*(1.d0-maskw(i-1,j,k,bi,bj)*maskw(i+1,j,k,bi,bj)
     $))
          adrjjp = adrjjp+adut(i,j)*((-(0.5d0*utrans(i,j)*onesixth))+
     $0.5d0*uth*onesixth*(1.d0-maskw(i-1,j,k,bi,bj)*maskw(i+1,j,k,bi,bj)
     $))
          adtracer(i-1,j) = adtracer(i-1,j)+0.5d0*adut(i,j)*utrans(i,j)
          adtracer(i,j) = adtracer(i,j)+0.5d0*adut(i,j)*utrans(i,j)
          aduth = 0.5d0*adut(i,j)*onesixth*(rjjp-rjjm)*(1.d0-maskw(i-1,
     $j,k,bi,bj)*maskw(i+1,j,k,bi,bj))
          adutrans(i,j) = adutrans(i,j)+0.5d0*adut(i,j)*(tracer(i,j)+
     $tracer(i-1,j)-onesixth*(rjjp+rjjm))
          adutrans(i,j) = adutrans(i,j)+aduth*sign(1.d0,utrans(i,j))
          adut(i,j) = 0.d0
          adrj = adrj+adrjjm
          adrjm = adrjm-adrjjm
          adrjjm = 0.d0
          adrj = adrj-adrjjp
          adrjp = adrjp+adrjjp
          adrjjp = 0.d0
          adtracer(i-2,j) = adtracer(i-2,j)-adrjm*maskw(i-1,j,k,bi,bj)
          adtracer(i-1,j) = adtracer(i-1,j)+adrjm*maskw(i-1,j,k,bi,bj)
          adrjm = 0.d0
          adtracer(i-1,j) = adtracer(i-1,j)-adrj*maskw(i,j,k,bi,bj)
          adtracer(i,j) = adtracer(i,j)+adrj*maskw(i,j,k,bi,bj)
          adrj = 0.d0
          adtracer(i+1,j) = adtracer(i+1,j)+adrjp*maskw(i+1,j,k,bi,bj)
          adtracer(i,j) = adtracer(i,j)-adrjp*maskw(i+1,j,k,bi,bj)
          adrjp = 0.d0
        end do
      end do

      end

      subroutine adgad_c4_adv_y( bi, bj, k, vtrans, advtrans, tracer, 
     $adtracer, advt )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision onesixth
      parameter ( onesixth = 1.d0/6.d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision advt(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adrj
      double precision adrjjm
      double precision adrjjp
      double precision adrjm
      double precision adrjp
      double precision advth
      integer i
      integer j
      double precision rj
      double precision rjjm
      double precision rjjp
      double precision rjm
      double precision rjp
      double precision vth

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adrj = 0.d0
      adrjjm = 0.d0
      adrjjp = 0.d0
      adrjm = 0.d0
      adrjp = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = sny+oly-1, 1-oly+2, -1
        adrj = 0.d0
        adrjjm = 0.d0
        adrjjp = 0.d0
        adrjm = 0.d0
        adrjp = 0.d0
        do i = snx+olx, 1-olx, -1
          adrj = 0.d0
          adrjjm = 0.d0
          adrjjp = 0.d0
          adrjm = 0.d0
          adrjp = 0.d0
          rjp = (tracer(i,j+1)-tracer(i,j))*masks(i,j+1,k,bi,bj)
          rj = (tracer(i,j)-tracer(i,j-1))*masks(i,j,k,bi,bj)
          rjm = (tracer(i,j-1)-tracer(i,j-2))*masks(i,j-1,k,bi,bj)
          rjjp = rjp-rj
          rjjm = rj-rjm
          vth = abs(vtrans(i,j))
          adrjjm = adrjjm+advt(i,j)*((-(0.5d0*vtrans(i,j)*onesixth))-
     $0.5d0*vth*onesixth*(1.d0-masks(i,j-1,k,bi,bj)*masks(i,j+1,k,bi,bj)
     $))
          adrjjp = adrjjp+advt(i,j)*((-(0.5d0*vtrans(i,j)*onesixth))+
     $0.5d0*vth*onesixth*(1.d0-masks(i,j-1,k,bi,bj)*masks(i,j+1,k,bi,bj)
     $))
          adtracer(i,j-1) = adtracer(i,j-1)+0.5d0*advt(i,j)*vtrans(i,j)
          adtracer(i,j) = adtracer(i,j)+0.5d0*advt(i,j)*vtrans(i,j)
          advth = 0.5d0*advt(i,j)*onesixth*(rjjp-rjjm)*(1.d0-masks(i,j-
     $1,k,bi,bj)*masks(i,j+1,k,bi,bj))
          advtrans(i,j) = advtrans(i,j)+0.5d0*advt(i,j)*(tracer(i,j)+
     $tracer(i,j-1)-onesixth*(rjjp+rjjm))
          advtrans(i,j) = advtrans(i,j)+advth*sign(1.d0,vtrans(i,j))
          advt(i,j) = 0.d0
          adrj = adrj+adrjjm
          adrjm = adrjm-adrjjm
          adrjjm = 0.d0
          adrj = adrj-adrjjp
          adrjp = adrjp+adrjjp
          adrjjp = 0.d0
          adtracer(i,j-2) = adtracer(i,j-2)-adrjm*masks(i,j-1,k,bi,bj)
          adtracer(i,j-1) = adtracer(i,j-1)+adrjm*masks(i,j-1,k,bi,bj)
          adrjm = 0.d0
          adtracer(i,j-1) = adtracer(i,j-1)-adrj*masks(i,j,k,bi,bj)
          adtracer(i,j) = adtracer(i,j)+adrj*masks(i,j,k,bi,bj)
          adrj = 0.d0
          adtracer(i,j+1) = adtracer(i,j+1)+adrjp*masks(i,j+1,k,bi,bj)
          adtracer(i,j) = adtracer(i,j)-adrjp*masks(i,j+1,k,bi,bj)
          adrjp = 0.d0
        end do
      end do
      do i = 1-olx, snx+olx
        advt(i,sny+oly) = 0.d0
        advt(i,2-oly) = 0.d0
        advt(i,1-oly) = 0.d0
      end do

      end

      subroutine adgad_calc_rhs( bi, bj, imin, imax, jmin, jmax, k, kup,
     $ kdown, xa, ya, maskup, ufld, adufld, vfld, advfld, wfld, adwfld, 
     $utrans, adutrans, vtrans, advtrans, rtrans, adrtrans, rtranskp1, 
     $adrtranskp1, diffkh, diffk4, kappar, adkappar, tracern, adtracern,
     $ tracab, adtracab, deltatlev, traceridentity, advectionscheme, 
     $vertadvecscheme, calcadvection, implicitadvection, 
     $applyab_ontracer, trusegmredi, adfvert, adgtracer, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer enum_centered_2nd
      parameter ( enum_centered_2nd = 2 )
      integer enum_centered_4th
      parameter ( enum_centered_4th = 4 )
      integer enum_dst2
      parameter ( enum_dst2 = 20 )
      integer enum_dst3
      parameter ( enum_dst3 = 30 )
      integer enum_dst3_flux_limit
      parameter ( enum_dst3_flux_limit = 33 )
      integer enum_flux_limit
      parameter ( enum_flux_limit = 77 )
      integer enum_os7mp
      parameter ( enum_os7mp = 7 )
      integer enum_upwind_1rst
      parameter ( enum_upwind_1rst = 1 )
      integer enum_upwind_3rd
      parameter ( enum_upwind_3rd = 3 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adfvert(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision adgtracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adkappar(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrtranskp1(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtracab(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtracern(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      integer advectionscheme
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly)
      logical applyab_ontracer
      integer bi
      integer bj
      logical calcadvection
      double precision deltatlev(nr)
      double precision diffk4
      double precision diffkh
      integer imax
      integer imin
      logical implicitadvection
      integer jmax
      integer jmin
      integer k
      double precision kappar(1-olx:snx+olx,1-oly:sny+oly)
      integer kdown
      integer kup
      double precision maskup(1-olx:snx+olx,1-oly:sny+oly)
      integer mythid
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision rtranskp1(1-olx:snx+olx,1-oly:sny+oly)
      double precision tracab(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer traceridentity
      double precision tracern(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      logical trusegmredi
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)
      integer vertadvecscheme
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adaf(1-olx:snx+olx,1-oly:sny+oly)
      double precision addf(1-olx:snx+olx,1-oly:sny+oly)
      double precision addf4(1-olx:snx+olx,1-oly:sny+oly)
      double precision adfmer(1-olx:snx+olx,1-oly:sny+oly)
      double precision adfzon(1-olx:snx+olx,1-oly:sny+oly)
      double precision adlocabt(1-olx:snx+olx,1-oly:sny+oly)
      double precision adlocalt(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfac
      double precision fmer(1-olx:snx+olx,1-oly:sny+oly)
      double precision fzon(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer ip1
      integer ip2
      integer j
      double precision locabt(1-olx:snx+olx,1-oly:sny+oly)
      double precision localt(1-olx:snx+olx,1-oly:sny+oly)
      double precision radvfac

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adaf(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          addf(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          addf4(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adfmer(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adfzon(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adlocabt(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adlocalt(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      advfac = 0.d0
      if (calcadvection) then
        advfac = 1.d0
      endif
      radvfac = rksign*advfac
      if (implicitadvection) then
        radvfac = 0.d0
      endif
      if (applyab_ontracer) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            localt(i,j) = tracern(i,j,k,bi,bj)
            locabt(i,j) = tracab(i,j,k,bi,bj)
          end do
        end do
      else
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            localt(i,j) = tracab(i,j,k,bi,bj)
            locabt(i,j) = tracab(i,j,k,bi,bj)
          end do
        end do
      endif
      if (diffk4 .ne. 0.) then
        call gad_grad_x( bi,bj,k,xa,localt,fzon,mythid )
        call gad_grad_y( bi,bj,k,ya,localt,fmer,mythid )
      endif
      do j = 1-oly, sny+oly-1
        do i = 1-olx, snx+olx-1
          adfmer(i,j+1) = adfmer(i,j+1)-adgtracer(i,j,k,bi,bj)*
     $recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_rhofacc(k)
          adfmer(i,j) = adfmer(i,j)+adgtracer(i,j,k,bi,bj)*recip_hfacc(
     $i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*
     $recip_rhofacc(k)
          adfvert(i,j,kdown) = adfvert(i,j,kdown)-adgtracer(i,j,k,bi,bj)
     $*recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_rhofacc(k)*rksign
          adfvert(i,j,kup) = adfvert(i,j,kup)+adgtracer(i,j,k,bi,bj)*
     $recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_rhofacc(k)*rksign
          adfzon(i+1,j) = adfzon(i+1,j)-adgtracer(i,j,k,bi,bj)*
     $recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_rhofacc(k)
          adfzon(i,j) = adfzon(i,j)+adgtracer(i,j,k,bi,bj)*recip_hfacc(
     $i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*
     $recip_rhofacc(k)
          adlocalt(i,j) = adlocalt(i,j)+adgtracer(i,j,k,bi,bj)*
     $recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_rhofacc(k)*(utrans(i+1,j)-utrans(i,j)+
     $vtrans(i,j+1)-vtrans(i,j)+(rtranskp1(i,j)-rtrans(i,j))*radvfac)*
     $advfac
          adrtrans(i,j) = adrtrans(i,j)-adgtracer(i,j,k,bi,bj)*
     $recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_rhofacc(k)*localt(i,j)*radvfac*advfac
          adrtranskp1(i,j) = adrtranskp1(i,j)+adgtracer(i,j,k,bi,bj)*
     $recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_rhofacc(k)*localt(i,j)*radvfac*advfac
          adutrans(i+1,j) = adutrans(i+1,j)+adgtracer(i,j,k,bi,bj)*
     $recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_rhofacc(k)*localt(i,j)*advfac
          adutrans(i,j) = adutrans(i,j)-adgtracer(i,j,k,bi,bj)*
     $recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_rhofacc(k)*localt(i,j)*advfac
          advtrans(i,j+1) = advtrans(i,j+1)+adgtracer(i,j,k,bi,bj)*
     $recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_rhofacc(k)*localt(i,j)*advfac
          advtrans(i,j) = advtrans(i,j)-adgtracer(i,j,k,bi,bj)*
     $recip_hfacc(i,j,k,bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_rhofacc(k)*localt(i,j)*advfac
        end do
      end do
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          addf(i,j) = addf(i,j)+adfvert(i,j,kup)*maskup(i,j)
        end do
      end do
      if (trusegmredi) then
        if (applyab_ontracer) then
          call adgmredi_rtransport( imin,imax,jmin,jmax,bi,bj,k,tracern,
     $adtracern,traceridentity,addf )
        else
          call adgmredi_rtransport( imin,imax,jmin,jmax,bi,bj,k,tracab,
     $adtracab,traceridentity,addf )
        endif
      endif
      if (implicitdiffusion) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            addf(i,j) = 0.d0
          end do
        end do
      else
        if (applyab_ontracer) then
          call adgad_diff_r( bi,bj,k,kappar,adkappar,tracern,adtracern,
     $addf )
        else
          call adgad_diff_r( bi,bj,k,kappar,adkappar,tracab,adtracab,
     $addf )
        endif
      endif
      if (calcadvection .and. ( .not. implicitadvection) .and. k .ge. 2)
     $ then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adaf(i,j) = adaf(i,j)+adfvert(i,j,kup)
          end do
        end do
        if (vertadvecscheme .eq. enum_centered_2nd) then
          call adgad_c2_adv_r( bi,bj,k,rtrans,adrtrans,tracab,adtracab,
     $adaf )
        else if (vertadvecscheme .eq. enum_upwind_1rst .or. 
     $vertadvecscheme .eq. enum_dst2) then
          call adgad_dst2u1_adv_r( bi,bj,k,vertadvecscheme,deltatlev(k),
     $rtrans,adrtrans,wfld,adwfld,tracab(1-olx,1-oly,1,bi,bj),adtracab(
     $1-olx,1-oly,1,bi,bj),adaf )
        else if (vertadvecscheme .eq. enum_flux_limit) then
          call adgad_fluxlimit_adv_r( bi,bj,k,deltatlev(k),rtrans,
     $adrtrans,wfld,adwfld,tracab(1-olx,1-oly,1,bi,bj),adtracab(1-olx,1-
     $oly,1,bi,bj),adaf )
        else if (vertadvecscheme .eq. enum_upwind_3rd) then
          call adgad_u3_adv_r( bi,bj,k,rtrans,adrtrans,tracab,adtracab,
     $adaf )
        else if (vertadvecscheme .eq. enum_centered_4th) then
          call adgad_c4_adv_r( bi,bj,k,rtrans,adrtrans,tracab,adtracab,
     $adaf )
        else if (vertadvecscheme .eq. enum_dst3) then
          call adgad_dst3_adv_r( bi,bj,k,deltatlev(k),rtrans,adrtrans,
     $wfld,adwfld,tracab(1-olx,1-oly,1,bi,bj),adtracab(1-olx,1-oly,1,bi,
     $bj),adaf )
        else if (vertadvecscheme .eq. enum_dst3_flux_limit) then
          if (inadmode) then
            call adgad_dst3_adv_r( bi,bj,k,deltatlev(k),rtrans,adrtrans,
     $wfld,adwfld,tracab(1-olx,1-oly,1,bi,bj),adtracab(1-olx,1-oly,1,bi,
     $bj),adaf )
          else
            call adgad_dst3fl_adv_r( bi,bj,k,deltatlev(k),rtrans,
     $adrtrans,wfld,adwfld,tracab(1-olx,1-oly,1,bi,bj),adtracab(1-olx,1-
     $oly,1,bi,bj),adaf )
          endif
        else if (vertadvecscheme .eq. enum_os7mp) then
          call adgad_os7mp_adv_r( bi,bj,k,deltatlev(k),rtrans,adrtrans,
     $wfld,adwfld,tracab(1-olx,1-oly,1,bi,bj),adtracab(1-olx,1-oly,1,bi,
     $bj),adaf )
        endif
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          addf(i,j) = addf(i,j)+adfmer(i,j)*rhofacc(k)
        end do
      end do
      if (trusegmredi) then
        if (applyab_ontracer) then
          call adgmredi_ytransport( imin,imax,jmin,jmax,bi,bj,k,ya,
     $tracern,adtracern,traceridentity,addf,mythid )
        else
          call adgmredi_ytransport( imin,imax,jmin,jmax,bi,bj,k,ya,
     $tracab,adtracab,traceridentity,addf,mythid )
        endif
      endif
      if (diffk4 .ne. 0.) then
        call adgad_biharm_y( bi,bj,k,ya,addf4,diffk4,addf )
      endif
      if (diffkh .ne. 0.) then
        call adgad_diff_y( bi,bj,k,ya,diffkh,adlocalt,addf )
      else
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            addf(i,j) = 0.d0
          end do
        end do
      endif
      if (calcadvection) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adaf(i,j) = adaf(i,j)+adfmer(i,j)
          end do
        end do
        if (advectionscheme .eq. enum_centered_2nd) then
          call adgad_c2_adv_y( vtrans,advtrans,locabt,adlocabt,adaf )
        else if (advectionscheme .eq. enum_upwind_1rst .or. 
     $advectionscheme .eq. enum_dst2) then
          call adgad_dst2u1_adv_y( bi,bj,k,advectionscheme, .true. ,
     $deltatlev(k),vtrans,advtrans,vfld,advfld,locabt,adlocabt,adaf )
        else if (advectionscheme .eq. enum_flux_limit) then
          call adgad_fluxlimit_adv_y( bi,bj,k, .true. ,deltatlev(k),
     $vtrans,advtrans,vfld,advfld,masks(1-olx,1-oly,k,bi,bj),locabt,
     $adlocabt,adaf )
        else if (advectionscheme .eq. enum_upwind_3rd) then
          call adgad_u3_adv_y( bi,bj,k,vtrans,advtrans,locabt,adlocabt,
     $adaf )
        else if (advectionscheme .eq. enum_centered_4th) then
          call adgad_c4_adv_y( bi,bj,k,vtrans,advtrans,locabt,adlocabt,
     $adaf )
        else if (advectionscheme .eq. enum_dst3) then
          call adgad_dst3_adv_y( bi,bj,k, .true. ,deltatlev(k),vtrans,
     $advtrans,vfld,advfld,masks(1-olx,1-oly,k,bi,bj),locabt,adlocabt,
     $adaf )
        else if (advectionscheme .eq. enum_dst3_flux_limit) then
          if (inadmode) then
            call adgad_dst3_adv_y( bi,bj,k, .true. ,deltatlev(k),vtrans,
     $advtrans,vfld,advfld,masks(1-olx,1-oly,k,bi,bj),locabt,adlocabt,
     $adaf )
          else
            call adgad_dst3fl_adv_y( bi,bj,k, .true. ,deltatlev(k),
     $vtrans,advtrans,vfld,advfld,masks(1-olx,1-oly,k,bi,bj),locabt,
     $adlocabt,adaf )
          endif
        else if (advectionscheme .eq. enum_os7mp) then
          call adgad_os7mp_adv_y( bi,bj, .true. ,deltatlev(k),vtrans,
     $advtrans,vfld,advfld,masks(1-olx,1-oly,k,bi,bj),locabt,adlocabt,
     $adaf )
        endif
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          adfmer(i,j) = 0.d0
        end do
      end do
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          addf(i,j) = addf(i,j)+adfzon(i,j)*rhofacc(k)
        end do
      end do
      if (trusegmredi) then
        if (applyab_ontracer) then
          call adgmredi_xtransport( imin,imax,jmin,jmax,bi,bj,k,xa,
     $tracern,adtracern,traceridentity,addf,mythid )
        else
          call adgmredi_xtransport( imin,imax,jmin,jmax,bi,bj,k,xa,
     $tracab,adtracab,traceridentity,addf,mythid )
        endif
      endif
      if (diffk4 .ne. 0.) then
        call adgad_biharm_x( bi,bj,k,xa,addf4,diffk4,addf )
      endif
      if (diffkh .ne. 0.) then
        call adgad_diff_x( bi,bj,k,xa,diffkh,adlocalt,addf )
      endif
      if (calcadvection) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adaf(i,j) = adaf(i,j)+adfzon(i,j)
          end do
        end do
        if (advectionscheme .eq. enum_centered_2nd) then
          call adgad_c2_adv_x( utrans,adutrans,locabt,adlocabt,adaf )
        else if (advectionscheme .eq. enum_upwind_1rst .or. 
     $advectionscheme .eq. enum_dst2) then
          call adgad_dst2u1_adv_x( bi,bj,k,advectionscheme, .true. ,
     $deltatlev(k),utrans,adutrans,ufld,adufld,locabt,adlocabt,adaf )
        else if (advectionscheme .eq. enum_flux_limit) then
          call adgad_fluxlimit_adv_x( bi,bj,k, .true. ,deltatlev(k),
     $utrans,adutrans,ufld,adufld,maskw(1-olx,1-oly,k,bi,bj),locabt,
     $adlocabt,adaf )
        else if (advectionscheme .eq. enum_upwind_3rd) then
          call adgad_u3_adv_x( bi,bj,k,utrans,adutrans,locabt,adlocabt,
     $adaf )
        else if (advectionscheme .eq. enum_centered_4th) then
          call adgad_c4_adv_x( bi,bj,k,utrans,adutrans,locabt,adlocabt,
     $adaf )
        else if (advectionscheme .eq. enum_dst3) then
          call adgad_dst3_adv_x( bi,bj,k, .true. ,deltatlev(k),utrans,
     $adutrans,ufld,adufld,maskw(1-olx,1-oly,k,bi,bj),locabt,adlocabt,
     $adaf )
        else if (advectionscheme .eq. enum_dst3_flux_limit) then
          if (inadmode) then
            call adgad_dst3_adv_x( bi,bj,k, .true. ,deltatlev(k),utrans,
     $adutrans,ufld,adufld,maskw(1-olx,1-oly,k,bi,bj),locabt,adlocabt,
     $adaf )
          else
            call adgad_dst3fl_adv_x( bi,bj,k, .true. ,deltatlev(k),
     $utrans,adutrans,ufld,adufld,maskw(1-olx,1-oly,k,bi,bj),locabt,
     $adlocabt,adaf )
          endif
        else if (advectionscheme .eq. enum_os7mp) then
          call adgad_os7mp_adv_x( bi,bj, .true. ,deltatlev(k),utrans,
     $adutrans,ufld,adufld,maskw(1-olx,1-oly,k,bi,bj),locabt,adlocabt,
     $adaf )
        endif
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          adfzon(i,j) = 0.d0
        end do
      end do
      if (diffk4 .ne. 0.) then
        call adgad_del2( bi,bj,k,adfzon,adfmer,addf4 )
        call adgad_grad_y( bi,bj,k,ya,adlocalt,adfmer )
        call adgad_grad_x( bi,bj,k,xa,adlocalt,adfzon )
      endif
      if (applyab_ontracer) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adtracab(i,j,k,bi,bj) = adtracab(i,j,k,bi,bj)+adlocabt(i,j)
            adlocabt(i,j) = 0.d0
            adtracern(i,j,k,bi,bj) = adtracern(i,j,k,bi,bj)+adlocalt(i,
     $j)
            adlocalt(i,j) = 0.d0
          end do
        end do
      else
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adtracab(i,j,k,bi,bj) = adtracab(i,j,k,bi,bj)+adlocabt(i,j)
            adlocabt(i,j) = 0.d0
            adtracab(i,j,k,bi,bj) = adtracab(i,j,k,bi,bj)+adlocalt(i,j)
            adlocalt(i,j) = 0.d0
          end do
        end do
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          adfvert(i,j,kup) = 0.d0
        end do
      end do

      end

      subroutine mdgad_calc_rhs( bi, bj, imin, imax, jmin, jmax, k, km1,
     $ kup, kdown, xa, ya, maskup, ufld, vfld, wfld, utrans, vtrans, 
     $rtrans, rtranskp1, diffkh, diffk4, kappar, tracern, tracab, 
     $deltatlev, traceridentity, advectionscheme, vertadvecscheme, 
     $calcadvection, implicitadvection, applyab_ontracer, trusegmredi, 
     $trusekpp, fvert, gtracer, mytime, myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer enum_centered_2nd
      parameter ( enum_centered_2nd = 2 )
      integer enum_centered_4th
      parameter ( enum_centered_4th = 4 )
      integer enum_dst2
      parameter ( enum_dst2 = 20 )
      integer enum_dst3
      parameter ( enum_dst3 = 30 )
      integer enum_dst3_flux_limit
      parameter ( enum_dst3_flux_limit = 33 )
      integer enum_flux_limit
      parameter ( enum_flux_limit = 77 )
      integer enum_os7mp
      parameter ( enum_os7mp = 7 )
      integer enum_upwind_1rst
      parameter ( enum_upwind_1rst = 1 )
      integer enum_upwind_3rd
      parameter ( enum_upwind_3rd = 3 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      integer advectionscheme
      logical applyab_ontracer
      integer bi
      integer bj
      logical calcadvection
      double precision deltatlev(nr)
      double precision diffk4
      double precision diffkh
      double precision fvert(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision gtracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer imax
      integer imin
      logical implicitadvection
      integer jmax
      integer jmin
      integer k
      double precision kappar(1-olx:snx+olx,1-oly:sny+oly)
      integer kdown
      integer km1
      integer kup
      double precision maskup(1-olx:snx+olx,1-oly:sny+oly)
      integer myiter
      integer mythid
      double precision mytime
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision rtranskp1(1-olx:snx+olx,1-oly:sny+oly)
      double precision tracab(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer traceridentity
      double precision tracern(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      logical trusegmredi
      logical trusekpp
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)
      integer vertadvecscheme
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision advfac
      double precision af(1-olx:snx+olx,1-oly:sny+oly)
      double precision df(1-olx:snx+olx,1-oly:sny+oly)
      double precision df4(1-olx:snx+olx,1-oly:sny+oly)
      double precision fmer(1-olx:snx+olx,1-oly:sny+oly)
      double precision fzon(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer j
      double precision locabt(1-olx:snx+olx,1-oly:sny+oly)
      double precision localt(1-olx:snx+olx,1-oly:sny+oly)
      double precision radvfac

C**********************************************
C executable statements of routine
C**********************************************
      fvert(1,1,kdown) = fvert(1,1,kdown)
      advfac = 0.d0
      if (calcadvection) then
        advfac = 1.d0
      endif
      radvfac = rksign*advfac
      if (implicitadvection) then
        radvfac = 0.d0
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          fzon(i,j) = 0.d0
          fmer(i,j) = 0.d0
          fvert(i,j,kup) = 0.d0
          df(i,j) = 0.d0
          df4(i,j) = 0.d0
        end do
      end do
      if (applyab_ontracer) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            localt(i,j) = tracern(i,j,k,bi,bj)
            locabt(i,j) = tracab(i,j,k,bi,bj)
          end do
        end do
      else
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            localt(i,j) = tracab(i,j,k,bi,bj)
            locabt(i,j) = tracab(i,j,k,bi,bj)
          end do
        end do
      endif
      if (diffk4 .ne. 0.) then
        call gad_grad_x( bi,bj,k,xa,localt,fzon,mythid )
        call gad_grad_y( bi,bj,k,ya,localt,fmer,mythid )
        call gad_del2( bi,bj,k,fzon,fmer,df4,mythid )
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          fzon(i,j) = 0.d0
        end do
      end do
      if (calcadvection) then
        if (advectionscheme .eq. enum_centered_2nd) then
          call gad_c2_adv_x( bi,bj,k,utrans,locabt,af,mythid )
        else if (advectionscheme .eq. enum_upwind_1rst .or. 
     $advectionscheme .eq. enum_dst2) then
          call gad_dst2u1_adv_x( bi,bj,k,advectionscheme, .true. ,
     $deltatlev(k),utrans,ufld,locabt,af,mythid )
        else if (advectionscheme .eq. enum_flux_limit) then
          call gad_fluxlimit_adv_x( bi,bj,k, .true. ,deltatlev(k),
     $utrans,ufld,maskw(1-olx,1-oly,k,bi,bj),locabt,af,mythid )
        else if (advectionscheme .eq. enum_upwind_3rd) then
          call gad_u3_adv_x( bi,bj,k,utrans,locabt,af,mythid )
        else if (advectionscheme .eq. enum_centered_4th) then
          call gad_c4_adv_x( bi,bj,k,utrans,locabt,af,mythid )
        else if (advectionscheme .eq. enum_dst3) then
          call gad_dst3_adv_x( bi,bj,k, .true. ,deltatlev(k),utrans,
     $ufld,maskw(1-olx,1-oly,k,bi,bj),locabt,af,mythid )
        else if (advectionscheme .eq. enum_dst3_flux_limit) then
          if (inadmode) then
            call gad_dst3_adv_x( bi,bj,k, .true. ,deltatlev(k),utrans,
     $ufld,maskw(1-olx,1-oly,k,bi,bj),locabt,af,mythid )
          else
            call gad_dst3fl_adv_x( bi,bj,k, .true. ,deltatlev(k),utrans,
     $ufld,maskw(1-olx,1-oly,k,bi,bj),locabt,af,mythid )
          endif
        else if (advectionscheme .eq. enum_os7mp) then
          call gad_os7mp_adv_x( bi,bj,k, .true. ,deltatlev(k),utrans,
     $ufld,maskw(1-olx,1-oly,k,bi,bj),locabt,af,mythid )
        endif
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            fzon(i,j) = fzon(i,j)+af(i,j)
          end do
        end do
      endif
      if (diffkh .ne. 0.) then
        call gad_diff_x( bi,bj,k,xa,diffkh,localt,df,mythid )
      else
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            df(i,j) = 0.d0
          end do
        end do
      endif
      if (diffk4 .ne. 0.) then
        call gad_biharm_x( bi,bj,k,xa,df4,diffk4,df,mythid )
      endif
      if (trusegmredi) then
        if (applyab_ontracer) then
          call mdgmredi_xtransport( imin,imax,jmin,jmax,bi,bj,k,xa,
     $tracern,traceridentity,df,mythid )
        else
          call mdgmredi_xtransport( imin,imax,jmin,jmax,bi,bj,k,xa,
     $tracab,traceridentity,df,mythid )
        endif
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          fzon(i,j) = fzon(i,j)+df(i,j)*rhofacc(k)
        end do
      end do
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          fmer(i,j) = 0.d0
        end do
      end do
      if (calcadvection) then
        if (advectionscheme .eq. enum_centered_2nd) then
          call gad_c2_adv_y( bi,bj,k,vtrans,locabt,af,mythid )
        else if (advectionscheme .eq. enum_upwind_1rst .or. 
     $advectionscheme .eq. enum_dst2) then
          call gad_dst2u1_adv_y( bi,bj,k,advectionscheme, .true. ,
     $deltatlev(k),vtrans,vfld,locabt,af,mythid )
        else if (advectionscheme .eq. enum_flux_limit) then
          call gad_fluxlimit_adv_y( bi,bj,k, .true. ,deltatlev(k),
     $vtrans,vfld,masks(1-olx,1-oly,k,bi,bj),locabt,af,mythid )
        else if (advectionscheme .eq. enum_upwind_3rd) then
          call gad_u3_adv_y( bi,bj,k,vtrans,locabt,af,mythid )
        else if (advectionscheme .eq. enum_centered_4th) then
          call gad_c4_adv_y( bi,bj,k,vtrans,locabt,af,mythid )
        else if (advectionscheme .eq. enum_dst3) then
          call gad_dst3_adv_y( bi,bj,k, .true. ,deltatlev(k),vtrans,
     $vfld,masks(1-olx,1-oly,k,bi,bj),locabt,af,mythid )
        else if (advectionscheme .eq. enum_dst3_flux_limit) then
          if (inadmode) then
            call gad_dst3_adv_y( bi,bj,k, .true. ,deltatlev(k),vtrans,
     $vfld,masks(1-olx,1-oly,k,bi,bj),locabt,af,mythid )
          else
            call gad_dst3fl_adv_y( bi,bj,k, .true. ,deltatlev(k),vtrans,
     $vfld,masks(1-olx,1-oly,k,bi,bj),locabt,af,mythid )
          endif
        else if (advectionscheme .eq. enum_os7mp) then
          call gad_os7mp_adv_y( bi,bj,k, .true. ,deltatlev(k),vtrans,
     $vfld,masks(1-olx,1-oly,k,bi,bj),locabt,af,mythid )
        endif
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            fmer(i,j) = fmer(i,j)+af(i,j)
          end do
        end do
      endif
      if (diffkh .ne. 0.) then
        call gad_diff_y( bi,bj,k,ya,diffkh,localt,df,mythid )
      else
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            df(i,j) = 0.d0
          end do
        end do
      endif
      if (diffk4 .ne. 0.) then
        call gad_biharm_y( bi,bj,k,ya,df4,diffk4,df,mythid )
      endif
      if (trusegmredi) then
        if (applyab_ontracer) then
          call mdgmredi_ytransport( imin,imax,jmin,jmax,bi,bj,k,ya,
     $tracern,traceridentity,df,mythid )
        else
          call mdgmredi_ytransport( imin,imax,jmin,jmax,bi,bj,k,ya,
     $tracab,traceridentity,df,mythid )
        endif
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          fmer(i,j) = fmer(i,j)+df(i,j)*rhofacc(k)
        end do
      end do
      if (calcadvection .and. ( .not. implicitadvection) .and. k .ge. 2)
     $ then
        if (vertadvecscheme .eq. enum_centered_2nd) then
          call gad_c2_adv_r( bi,bj,k,rtrans,tracab,af,mythid )
        else if (vertadvecscheme .eq. enum_upwind_1rst .or. 
     $vertadvecscheme .eq. enum_dst2) then
          call gad_dst2u1_adv_r( bi,bj,k,vertadvecscheme,deltatlev(k),
     $rtrans,wfld,tracab(1-olx,1-oly,1,bi,bj),af,mythid )
        else if (vertadvecscheme .eq. enum_flux_limit) then
          call gad_fluxlimit_adv_r( bi,bj,k,deltatlev(k),rtrans,wfld,
     $tracab(1-olx,1-oly,1,bi,bj),af,mythid )
        else if (vertadvecscheme .eq. enum_upwind_3rd) then
          call gad_u3_adv_r( bi,bj,k,rtrans,tracab,af,mythid )
        else if (vertadvecscheme .eq. enum_centered_4th) then
          call gad_c4_adv_r( bi,bj,k,rtrans,tracab,af,mythid )
        else if (vertadvecscheme .eq. enum_dst3) then
          call gad_dst3_adv_r( bi,bj,k,deltatlev(k),rtrans,wfld,tracab(
     $1-olx,1-oly,1,bi,bj),af,mythid )
        else if (vertadvecscheme .eq. enum_dst3_flux_limit) then
          if (inadmode) then
            call gad_dst3_adv_r( bi,bj,k,deltatlev(k),rtrans,wfld,
     $tracab(1-olx,1-oly,1,bi,bj),af,mythid )
          else
            call gad_dst3fl_adv_r( bi,bj,k,deltatlev(k),rtrans,wfld,
     $tracab(1-olx,1-oly,1,bi,bj),af,mythid )
          endif
        else if (vertadvecscheme .eq. enum_os7mp) then
          call gad_os7mp_adv_r( bi,bj,k,deltatlev(k),rtrans,wfld,tracab(
     $1-olx,1-oly,1,bi,bj),af,mythid )
        endif
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            fvert(i,j,kup) = fvert(i,j,kup)+af(i,j)
          end do
        end do
      endif
      if (implicitdiffusion) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            df(i,j) = 0.d0
          end do
        end do
      else
        if (applyab_ontracer) then
          call gad_diff_r( bi,bj,k,kappar,tracern,df,mythid )
        else
          call gad_diff_r( bi,bj,k,kappar,tracab,df,mythid )
        endif
      endif
      if (trusegmredi) then
        if (applyab_ontracer) then
          call gmredi_rtransport( imin,imax,jmin,jmax,bi,bj,k,tracern,
     $traceridentity,df,mythid )
        else
          call gmredi_rtransport( imin,imax,jmin,jmax,bi,bj,k,tracab,
     $traceridentity,df,mythid )
        endif
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          fvert(i,j,kup) = fvert(i,j,kup)+df(i,j)*maskup(i,j)
        end do
      end do
      do j = 1-oly, sny+oly-1
        do i = 1-olx, snx+olx-1
          gtracer(i,j,k,bi,bj) = gtracer(i,j,k,bi,bj)-recip_hfacc(i,j,k,
     $bi,bj)*recip_drf(k)*recip_ra(i,j,bi,bj)*recip_deepfac2c(k)*
     $recip_rhofacc(k)*(fzon(i+1,j)-fzon(i,j)+fmer(i,j+1)-fmer(i,j)+(
     $fvert(i,j,kdown)-fvert(i,j,kup))*rksign-localt(i,j)*(utrans(i+1,j)
     $-utrans(i,j)+vtrans(i,j+1)-vtrans(i,j)+(rtranskp1(i,j)-rtrans(i,j)
     $)*radvfac)*advfac)
        end do
      end do
      end

      subroutine adgad_del2( bi, bj, k, addtdx, addtdy, addel2 )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision addel2(1-olx:snx+olx,1-oly:sny+oly)
      double precision addtdx(1-olx:snx+olx,1-oly:sny+oly)
      double precision addtdy(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly, sny+oly-1
        do i = 1-olx, snx+olx-1
          addtdx(i+1,j) = addtdx(i+1,j)+addel2(i,j)*recip_ra(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_drf(k)*recip_hfacc(i,j,k,bi,bj)
          addtdx(i,j) = addtdx(i,j)-addel2(i,j)*recip_ra(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_drf(k)*recip_hfacc(i,j,k,bi,bj)
          addtdy(i,j+1) = addtdy(i,j+1)+addel2(i,j)*recip_ra(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_drf(k)*recip_hfacc(i,j,k,bi,bj)
          addtdy(i,j) = addtdy(i,j)-addel2(i,j)*recip_ra(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_drf(k)*recip_hfacc(i,j,k,bi,bj)
          addel2(i,j) = 0.d0
        end do
      end do

      end

      subroutine adgad_diff_r( bi, bj, k, kappar, adkappar, tracer, 
     $adtracer, addfr )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision addfr(1-olx:snx+olx,1-oly:sny+oly)
      double precision adkappar(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer k
      double precision kappar(1-olx:snx+olx,1-oly:sny+oly)
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      integer km1

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      km1 = max(1,k-1)
      if (k .eq. 1 .or. k .gt. nr) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            addfr(i,j) = 0.d0
          end do
        end do
      else
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adkappar(i,j) = adkappar(i,j)-addfr(i,j)*ra(i,j,bi,bj)*
     $deepfac2f(k)*rhofacf(k)*recip_drc(k)*(tracer(i,j,k,bi,bj)-tracer(
     $i,j,km1,bi,bj))*rksign
            adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)-addfr(i,j)*
     $kappar(i,j)*ra(i,j,bi,bj)*deepfac2f(k)*rhofacf(k)*recip_drc(k)*
     $rksign
            adtracer(i,j,km1,bi,bj) = adtracer(i,j,km1,bi,bj)+addfr(i,j)
     $*kappar(i,j)*ra(i,j,bi,bj)*deepfac2f(k)*rhofacf(k)*recip_drc(k)*
     $rksign
            addfr(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine adgad_diff_x( bi, bj, k, xa, diffkh, adtracer, addfx )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision addfx(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision diffkh
      integer k
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly, sny+oly
        do i = 1-olx+1, snx+olx
          adtracer(i-1,j) = adtracer(i-1,j)+addfx(i,j)*diffkh*xa(i,j)*
     $recip_dxc(i,j,bi,bj)*recip_deepfacc(k)*cosfacu(j,bi,bj)
          adtracer(i,j) = adtracer(i,j)-addfx(i,j)*diffkh*xa(i,j)*
     $recip_dxc(i,j,bi,bj)*recip_deepfacc(k)*cosfacu(j,bi,bj)
          addfx(i,j) = 0.d0
        end do
        addfx(1-olx,j) = 0.d0
      end do

      end

      subroutine adgad_diff_y( bi, bj, k, ya, diffkh, adtracer, addfy )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision addfy(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision diffkh
      integer k
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly+1, sny+oly
        do i = 1-olx, snx+olx
          adtracer(i,j-1) = adtracer(i,j-1)+addfy(i,j)*diffkh*ya(i,j)*
     $recip_dyc(i,j,bi,bj)*recip_deepfacc(k)
          adtracer(i,j) = adtracer(i,j)-addfy(i,j)*diffkh*ya(i,j)*
     $recip_dyc(i,j,bi,bj)*recip_deepfacc(k)
          addfy(i,j) = 0.d0
        end do
      end do
      do i = 1-olx, snx+olx
        addfy(i,1-oly) = 0.d0
      end do

      end

      subroutine adgad_dst2u1_adv_r( bi, bj, k, advectionscheme, 
     $deltatloc, rtrans, adrtrans, wfld, adwfld, tracer, adtracer, adwt 
     $)
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer enum_dst2
      parameter ( enum_dst2 = 20 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adrtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly,nr)
      integer advectionscheme
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adwt(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision deltatloc
      integer k
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adwabs
      double precision adwabsh
      double precision adwcfl
      double precision adwloc
      integer i
      integer j
      integer km1
      double precision rlimit
      double precision wabs
      double precision wcfl
      double precision wloc

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adwabs = 0.d0
      adwcfl = 0.d0
      adwloc = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      rlimit = 0.d0
      if (advectionscheme .eq. enum_dst2) then
        rlimit = 1.d0
      endif
      km1 = max(1,k-1)
      if (k .le. 1 .or. k .gt. nr) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adwt(i,j) = 0.d0
          end do
        end do
      else
        do j = sny+oly, 1-oly, -1
          adwabs = 0.d0
          adwcfl = 0.d0
          adwloc = 0.d0
          do i = snx+olx, 1-olx, -1
            adwabs = 0.d0
            adwcfl = 0.d0
            adwloc = 0.d0
            wloc = wfld(i,j)
            wcfl = abs(wloc*deltatloc*recip_drc(k))
            wabs = abs(rtrans(i,j))*rksign*(1.d0-rlimit*(1.d0-wcfl))
            adrtrans(i,j) = adrtrans(i,j)+adwt(i,j)*maskc(i,j,km1,bi,bj)
     $*(0.5d0*tracer(i,j,km1)+0.5d0*tracer(i,j,k))
            adtracer(i,j,k) = adtracer(i,j,k)+0.5d0*adwt(i,j)*maskc(i,j,
     $km1,bi,bj)*(rtrans(i,j)-wabs)
            adtracer(i,j,km1) = adtracer(i,j,km1)+0.5d0*adwt(i,j)*maskc(
     $i,j,km1,bi,bj)*(rtrans(i,j)+wabs)
            adwabs = adwabs+adwt(i,j)*maskc(i,j,km1,bi,bj)*(0.5d0*
     $tracer(i,j,km1)-0.5d0*tracer(i,j,k))
            adwt(i,j) = 0.d0
            adwabsh = adwabs*rksign*(1.d0-rlimit*(1.d0-wcfl))
            adwcfl = adwcfl+adwabs*rksign*rlimit*abs(rtrans(i,j))
            adrtrans(i,j) = adrtrans(i,j)+adwabsh*sign(1.d0,rtrans(i,j))
            adwabs = 0.d0
            adwloc = adwloc+adwcfl*deltatloc*recip_drc(k)*sign(1.d0,
     $wloc*deltatloc*recip_drc(k))
            adwcfl = 0.d0
            adwfld(i,j) = adwfld(i,j)+adwloc
            adwloc = 0.d0
          end do
        end do
      endif

      end

      subroutine adgad_dst2u1_adv_x( bi, bj, k, advectionscheme, 
     $calccfl, deltatloc, utrans, adutrans, ufld, adufld, tracer, 
     $adtracer, adut )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer enum_dst2
      parameter ( enum_dst2 = 20 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adut(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      integer advectionscheme
      integer bi
      integer bj
      logical calccfl
      double precision deltatloc
      integer k
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision aduabs
      double precision aduabsh
      double precision aducfl
      integer i
      integer j
      double precision uabs
      double precision ucfl
      double precision xlimit

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      aduabs = 0.d0
      aducfl = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      xlimit = 0.d0
      if (advectionscheme .eq. enum_dst2) then
        xlimit = 1.d0
      endif
      do j = sny+oly, 1-oly, -1
        aduabs = 0.d0
        aducfl = 0.d0
        do i = snx+olx, 1-olx+1, -1
          aduabs = 0.d0
          aducfl = 0.d0
          ucfl = ufld(i,j)
          if (calccfl) then
            ucfl = abs(ufld(i,j)*deltatloc*recip_dxc(i,j,bi,bj)*
     $recip_deepfacc(k))
          endif
          uabs = abs(utrans(i,j))*(1.d0-xlimit*(1.d0-ucfl))
          adtracer(i-1,j) = adtracer(i-1,j)+0.5d0*adut(i,j)*(utrans(i,j)
     $+uabs)
          adtracer(i,j) = adtracer(i,j)+0.5d0*adut(i,j)*(utrans(i,j)-
     $uabs)
          aduabs = aduabs+adut(i,j)*(0.5d0*tracer(i-1,j)-0.5d0*tracer(i,
     $j))
          adutrans(i,j) = adutrans(i,j)+adut(i,j)*(0.5d0*tracer(i-1,j)+
     $0.5d0*tracer(i,j))
          adut(i,j) = 0.d0
          aduabsh = aduabs*(1.d0-xlimit*(1.d0-ucfl))
          aducfl = aducfl+aduabs*xlimit*abs(utrans(i,j))
          adutrans(i,j) = adutrans(i,j)+aduabsh*sign(1.d0,utrans(i,j))
          aduabs = 0.d0
          if (calccfl) then
            adufld(i,j) = adufld(i,j)+aducfl*deltatloc*recip_dxc(i,j,bi,
     $bj)*recip_deepfacc(k)*sign(1.d0,ufld(i,j)*deltatloc*recip_dxc(i,j,
     $bi,bj)*recip_deepfacc(k))
            aducfl = 0.d0
          endif
          adufld(i,j) = adufld(i,j)+aducfl
          aducfl = 0.d0
        end do
      end do
      do j = 1-oly, sny+oly
        adut(1-olx,j) = 0.d0
      end do

      end

      subroutine adgad_dst2u1_adv_y( bi, bj, k, advectionscheme, 
     $calccfl, deltatloc, vtrans, advtrans, vfld, advfld, tracer, 
     $adtracer, advt )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer enum_dst2
      parameter ( enum_dst2 = 20 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly)
      integer advectionscheme
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advt(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      logical calccfl
      double precision deltatloc
      integer k
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision advabs
      double precision advabsh
      double precision advcfl
      integer i
      integer j
      double precision vabs
      double precision vcfl
      double precision ylimit

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      advabs = 0.d0
      advcfl = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      ylimit = 0.d0
      if (advectionscheme .eq. enum_dst2) then
        ylimit = 1.d0
      endif
      do j = sny+oly, 1-oly+1, -1
        advabs = 0.d0
        advcfl = 0.d0
        do i = snx+olx, 1-olx, -1
          advabs = 0.d0
          advcfl = 0.d0
          vcfl = vfld(i,j)
          if (calccfl) then
            vcfl = abs(vfld(i,j)*deltatloc*recip_dyc(i,j,bi,bj)*
     $recip_deepfacc(k))
          endif
          vabs = abs(vtrans(i,j))*(1.d0-ylimit*(1.d0-vcfl))
          adtracer(i,j-1) = adtracer(i,j-1)+0.5d0*advt(i,j)*(vtrans(i,j)
     $+vabs)
          adtracer(i,j) = adtracer(i,j)+0.5d0*advt(i,j)*(vtrans(i,j)-
     $vabs)
          advabs = advabs+advt(i,j)*(0.5d0*tracer(i,j-1)-0.5d0*tracer(i,
     $j))
          advtrans(i,j) = advtrans(i,j)+advt(i,j)*(0.5d0*tracer(i,j-1)+
     $0.5d0*tracer(i,j))
          advt(i,j) = 0.d0
          advabsh = advabs*(1.d0-ylimit*(1.d0-vcfl))
          advcfl = advcfl+advabs*ylimit*abs(vtrans(i,j))
          advtrans(i,j) = advtrans(i,j)+advabsh*sign(1.d0,vtrans(i,j))
          advabs = 0.d0
          if (calccfl) then
            advfld(i,j) = advfld(i,j)+advcfl*deltatloc*recip_dyc(i,j,bi,
     $bj)*recip_deepfacc(k)*sign(1.d0,vfld(i,j)*deltatloc*recip_dyc(i,j,
     $bi,bj)*recip_deepfacc(k))
            advcfl = 0.d0
          endif
          advfld(i,j) = advfld(i,j)+advcfl
          advcfl = 0.d0
        end do
      end do
      do i = 1-olx, snx+olx
        advt(i,1-oly) = 0.d0
      end do

      end

      subroutine adgad_dst3_adv_r( bi, bj, k, dtarg, rtrans, adrtrans, 
     $wfld, adwfld, tracer, adtracer, adwt )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision onesixth
      parameter ( onesixth = 1.d0/6.d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adrtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adwt(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision dtarg
      integer k
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adcfl
      double precision add0
      double precision add1
      double precision adrj
      double precision adrjm
      double precision adrjp
      double precision adwloc
      double precision adwth
      double precision adwti
      double precision cfl
      double precision d0
      double precision d1
      integer i
      integer j
      integer km1
      integer km2
      integer kp1
      double precision rj
      double precision rjm
      double precision rjp
      double precision wloc
      double precision wth
      double precision wti

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adcfl = 0.d0
      add0 = 0.d0
      add1 = 0.d0
      adrj = 0.d0
      adrjm = 0.d0
      adrjp = 0.d0
      adwloc = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      km2 = max(1,k-2)
      km1 = max(1,k-1)
      kp1 = min(nr,k+1)
      do j = sny+oly, 1-oly, -1
        adcfl = 0.d0
        add0 = 0.d0
        add1 = 0.d0
        adrj = 0.d0
        adrjm = 0.d0
        adrjp = 0.d0
        adwloc = 0.d0
        do i = snx+olx, 1-olx, -1
          adcfl = 0.d0
          add0 = 0.d0
          add1 = 0.d0
          adrj = 0.d0
          adrjm = 0.d0
          adrjp = 0.d0
          adwloc = 0.d0
          rjp = (tracer(i,j,k)-tracer(i,j,kp1))*maskc(i,j,kp1,bi,bj)
          rj = (tracer(i,j,km1)-tracer(i,j,k))*maskc(i,j,k,bi,bj)*maskc(
     $i,j,km1,bi,bj)
          rjm = (tracer(i,j,km2)-tracer(i,j,km1))*maskc(i,j,km1,bi,bj)
          wloc = wfld(i,j)
          cfl = abs(wloc*dtarg*recip_drc(k))
          d0 = (2.-cfl)*(1.-cfl)*onesixth
          d1 = (1.-cfl*cfl)*onesixth
          wth = abs(rtrans(i,j))
          wti = abs(rtrans(i,j))
          add0 = add0+adwt(i,j)*(0.5*(rtrans(i,j)+wti)*rj-0.5*(rtrans(i,
     $j)-wth)*rj)
          add1 = add1+adwt(i,j)*(0.5*(rtrans(i,j)+wti)*rjp-0.5*(rtrans(
     $i,j)-wth)*rjm)
          adrj = adrj+adwt(i,j)*(0.5*(rtrans(i,j)+wti)*d0-0.5*(rtrans(i,
     $j)-wth)*d0)
          adrjm = adrjm-0.5*adwt(i,j)*(rtrans(i,j)-wth)*d1
          adrjp = adrjp+0.5*adwt(i,j)*(rtrans(i,j)+wti)*d1
          adrtrans(i,j) = adrtrans(i,j)+adwt(i,j)*(0.5*(tracer(i,j,k)+
     $d0*rj+d1*rjp)+0.5*(tracer(i,j,km1)-(d0*rj+d1*rjm)))
          adtracer(i,j,k) = adtracer(i,j,k)+0.5*adwt(i,j)*(rtrans(i,j)+
     $wti)
          adtracer(i,j,km1) = adtracer(i,j,km1)+0.5*adwt(i,j)*(rtrans(i,
     $j)-wth)
          adwth = (-0.5)*adwt(i,j)*(tracer(i,j,km1)-(d0*rj+d1*rjm))
          adwti = 0.5*adwt(i,j)*(tracer(i,j,k)+d0*rj+d1*rjp)
          adrtrans(i,j) = adrtrans(i,j)+adwti*sign(1.d0,rtrans(i,j))
          adrtrans(i,j) = adrtrans(i,j)+adwth*sign(1.d0,rtrans(i,j))
          adwt(i,j) = 0.d0
          adcfl = adcfl-2*add1*cfl*onesixth
          add1 = 0.d0
          adcfl = adcfl+add0*((-(2.-cfl))-(1.-cfl))*onesixth
          add0 = 0.d0
          adwloc = adwloc+adcfl*dtarg*recip_drc(k)*sign(1.d0,wloc*dtarg*
     $recip_drc(k))
          adcfl = 0.d0
          adwfld(i,j) = adwfld(i,j)+adwloc
          adwloc = 0.d0
          adtracer(i,j,km1) = adtracer(i,j,km1)-adrjm*maskc(i,j,km1,bi,
     $bj)
          adtracer(i,j,km2) = adtracer(i,j,km2)+adrjm*maskc(i,j,km1,bi,
     $bj)
          adrjm = 0.d0
          adtracer(i,j,k) = adtracer(i,j,k)-adrj*maskc(i,j,k,bi,bj)*
     $maskc(i,j,km1,bi,bj)
          adtracer(i,j,km1) = adtracer(i,j,km1)+adrj*maskc(i,j,k,bi,bj)*
     $maskc(i,j,km1,bi,bj)
          adrj = 0.d0
          adtracer(i,j,k) = adtracer(i,j,k)+adrjp*maskc(i,j,kp1,bi,bj)
          adtracer(i,j,kp1) = adtracer(i,j,kp1)-adrjp*maskc(i,j,kp1,bi,
     $bj)
          adrjp = 0.d0
        end do
      end do

      end

      subroutine adgad_dst3_adv_x( bi, bj, k, calccfl, deltatloc, 
     $utrans, adutrans, ufld, adufld, masklocw, tracer, adtracer, adut )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision onesixth
      parameter ( onesixth = 1.d0/6.d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adut(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      logical calccfl
      double precision deltatloc
      integer k
      double precision masklocw(1-olx:snx+olx,1-oly:sny+oly)
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision add0
      double precision add1
      double precision adrj
      double precision adrjm
      double precision adrjp
      double precision aducfl
      double precision aduth
      double precision aduti
      double precision d0
      double precision d1
      integer i
      integer j
      double precision rj
      double precision rjm
      double precision rjp
      double precision ucfl
      double precision uth
      double precision uti

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      add0 = 0.d0
      add1 = 0.d0
      adrj = 0.d0
      adrjm = 0.d0
      adrjp = 0.d0
      aducfl = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = sny+oly, 1-oly, -1
        add0 = 0.d0
        add1 = 0.d0
        adrj = 0.d0
        adrjm = 0.d0
        adrjp = 0.d0
        aducfl = 0.d0
        do i = snx+olx-1, 1-olx+2, -1
          add0 = 0.d0
          add1 = 0.d0
          adrj = 0.d0
          adrjm = 0.d0
          adrjp = 0.d0
          aducfl = 0.d0
          rjp = (tracer(i+1,j)-tracer(i,j))*masklocw(i+1,j)
          rj = (tracer(i,j)-tracer(i-1,j))*masklocw(i,j)
          rjm = (tracer(i-1,j)-tracer(i-2,j))*masklocw(i-1,j)
          ucfl = ufld(i,j)
          if (calccfl) then
            ucfl = abs(ufld(i,j)*deltatloc*recip_dxc(i,j,bi,bj)*
     $recip_deepfacc(k))
          endif
          d0 = (2.-ucfl)*(1.-ucfl)*onesixth
          d1 = (1.-ucfl*ucfl)*onesixth
          uth = abs(utrans(i,j))
          uti = abs(utrans(i,j))
          add0 = add0+adut(i,j)*(0.5*(utrans(i,j)+uti)*rj-0.5*(utrans(i,
     $j)-uth)*rj)
          add1 = add1+adut(i,j)*(0.5*(utrans(i,j)+uti)*rjm-0.5*(utrans(
     $i,j)-uth)*rjp)
          adrj = adrj+adut(i,j)*(0.5*(utrans(i,j)+uti)*d0-0.5*(utrans(i,
     $j)-uth)*d0)
          adrjm = adrjm+0.5*adut(i,j)*(utrans(i,j)+uti)*d1
          adrjp = adrjp-0.5*adut(i,j)*(utrans(i,j)-uth)*d1
          adtracer(i-1,j) = adtracer(i-1,j)+0.5*adut(i,j)*(utrans(i,j)+
     $uti)
          adtracer(i,j) = adtracer(i,j)+0.5*adut(i,j)*(utrans(i,j)-uth)
          aduth = (-0.5)*adut(i,j)*(tracer(i,j)-(d0*rj+d1*rjp))
          aduti = 0.5*adut(i,j)*(tracer(i-1,j)+d0*rj+d1*rjm)
          adutrans(i,j) = adutrans(i,j)+adut(i,j)*(0.5*(tracer(i-1,j)+
     $d0*rj+d1*rjm)+0.5*(tracer(i,j)-(d0*rj+d1*rjp)))
          adutrans(i,j) = adutrans(i,j)+aduti*sign(1.d0,utrans(i,j))
          adutrans(i,j) = adutrans(i,j)+aduth*sign(1.d0,utrans(i,j))
          adut(i,j) = 0.d0
          aducfl = aducfl-2*add1*ucfl*onesixth
          add1 = 0.d0
          aducfl = aducfl+add0*((-(2.-ucfl))-(1.-ucfl))*onesixth
          add0 = 0.d0
          if (calccfl) then
            adufld(i,j) = adufld(i,j)+aducfl*deltatloc*recip_dxc(i,j,bi,
     $bj)*recip_deepfacc(k)*sign(1.d0,ufld(i,j)*deltatloc*recip_dxc(i,j,
     $bi,bj)*recip_deepfacc(k))
            aducfl = 0.d0
          endif
          adufld(i,j) = adufld(i,j)+aducfl
          aducfl = 0.d0
          adtracer(i-2,j) = adtracer(i-2,j)-adrjm*masklocw(i-1,j)
          adtracer(i-1,j) = adtracer(i-1,j)+adrjm*masklocw(i-1,j)
          adrjm = 0.d0
          adtracer(i-1,j) = adtracer(i-1,j)-adrj*masklocw(i,j)
          adtracer(i,j) = adtracer(i,j)+adrj*masklocw(i,j)
          adrj = 0.d0
          adtracer(i+1,j) = adtracer(i+1,j)+adrjp*masklocw(i+1,j)
          adtracer(i,j) = adtracer(i,j)-adrjp*masklocw(i+1,j)
          adrjp = 0.d0
        end do
      end do
      do j = 1-oly, sny+oly
        adut(snx+olx,j) = 0.d0
        adut(2-olx,j) = 0.d0
        adut(1-olx,j) = 0.d0
      end do

      end

      subroutine adgad_dst3_adv_y( bi, bj, k, calccfl, deltatloc, 
     $vtrans, advtrans, vfld, advfld, masklocs, tracer, adtracer, advt )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision onesixth
      parameter ( onesixth = 1.d0/6.d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advt(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      logical calccfl
      double precision deltatloc
      integer k
      double precision masklocs(1-olx:snx+olx,1-oly:sny+oly)
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision add0
      double precision add1
      double precision adrj
      double precision adrjm
      double precision adrjp
      double precision advcfl
      double precision advth
      double precision advti
      double precision d0
      double precision d1
      integer i
      integer j
      double precision rj
      double precision rjm
      double precision rjp
      double precision vcfl
      double precision vth
      double precision vti

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      add0 = 0.d0
      add1 = 0.d0
      adrj = 0.d0
      adrjm = 0.d0
      adrjp = 0.d0
      advcfl = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = sny+oly-1, 1-oly+2, -1
        add0 = 0.d0
        add1 = 0.d0
        adrj = 0.d0
        adrjm = 0.d0
        adrjp = 0.d0
        advcfl = 0.d0
        do i = snx+olx, 1-olx, -1
          add0 = 0.d0
          add1 = 0.d0
          adrj = 0.d0
          adrjm = 0.d0
          adrjp = 0.d0
          advcfl = 0.d0
          rjp = (tracer(i,j+1)-tracer(i,j))*masklocs(i,j+1)
          rj = (tracer(i,j)-tracer(i,j-1))*masklocs(i,j)
          rjm = (tracer(i,j-1)-tracer(i,j-2))*masklocs(i,j-1)
          vcfl = vfld(i,j)
          if (calccfl) then
            vcfl = abs(vfld(i,j)*deltatloc*recip_dyc(i,j,bi,bj)*
     $recip_deepfacc(k))
          endif
          d0 = (2.-vcfl)*(1.-vcfl)*onesixth
          d1 = (1.-vcfl*vcfl)*onesixth
          vth = abs(vtrans(i,j))
          vti = abs(vtrans(i,j))
          add0 = add0+advt(i,j)*(0.5*(vtrans(i,j)+vti)*rj-0.5*(vtrans(i,
     $j)-vth)*rj)
          add1 = add1+advt(i,j)*(0.5*(vtrans(i,j)+vti)*rjm-0.5*(vtrans(
     $i,j)-vth)*rjp)
          adrj = adrj+advt(i,j)*(0.5*(vtrans(i,j)+vti)*d0-0.5*(vtrans(i,
     $j)-vth)*d0)
          adrjm = adrjm+0.5*advt(i,j)*(vtrans(i,j)+vti)*d1
          adrjp = adrjp-0.5*advt(i,j)*(vtrans(i,j)-vth)*d1
          adtracer(i,j-1) = adtracer(i,j-1)+0.5*advt(i,j)*(vtrans(i,j)+
     $vti)
          adtracer(i,j) = adtracer(i,j)+0.5*advt(i,j)*(vtrans(i,j)-vth)
          advth = (-0.5)*advt(i,j)*(tracer(i,j)-(d0*rj+d1*rjp))
          advti = 0.5*advt(i,j)*(tracer(i,j-1)+d0*rj+d1*rjm)
          advtrans(i,j) = advtrans(i,j)+advt(i,j)*(0.5*(tracer(i,j-1)+
     $d0*rj+d1*rjm)+0.5*(tracer(i,j)-(d0*rj+d1*rjp)))
          advtrans(i,j) = advtrans(i,j)+advti*sign(1.d0,vtrans(i,j))
          advtrans(i,j) = advtrans(i,j)+advth*sign(1.d0,vtrans(i,j))
          advt(i,j) = 0.d0
          advcfl = advcfl-2*add1*vcfl*onesixth
          add1 = 0.d0
          advcfl = advcfl+add0*((-(2.-vcfl))-(1.-vcfl))*onesixth
          add0 = 0.d0
          if (calccfl) then
            advfld(i,j) = advfld(i,j)+advcfl*deltatloc*recip_dyc(i,j,bi,
     $bj)*recip_deepfacc(k)*sign(1.d0,vfld(i,j)*deltatloc*recip_dyc(i,j,
     $bi,bj)*recip_deepfacc(k))
            advcfl = 0.d0
          endif
          advfld(i,j) = advfld(i,j)+advcfl
          advcfl = 0.d0
          adtracer(i,j-2) = adtracer(i,j-2)-adrjm*masklocs(i,j-1)
          adtracer(i,j-1) = adtracer(i,j-1)+adrjm*masklocs(i,j-1)
          adrjm = 0.d0
          adtracer(i,j-1) = adtracer(i,j-1)-adrj*masklocs(i,j)
          adtracer(i,j) = adtracer(i,j)+adrj*masklocs(i,j)
          adrj = 0.d0
          adtracer(i,j+1) = adtracer(i,j+1)+adrjp*masklocs(i,j+1)
          adtracer(i,j) = adtracer(i,j)-adrjp*masklocs(i,j+1)
          adrjp = 0.d0
        end do
      end do
      do i = 1-olx, snx+olx
        advt(i,sny+oly) = 0.d0
        advt(i,2-oly) = 0.d0
        advt(i,1-oly) = 0.d0
      end do

      end

      subroutine adgad_dst3fl_adv_r( bi, bj, k, dtarg, rtrans, adrtrans,
     $ wfld, adwfld, tracer, adtracer, adwt )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision onesixth
      parameter ( onesixth = 1.d0/6.d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )
      double precision thetamax
      parameter ( thetamax = 1.d+20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adrtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adwt(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision dtarg
      integer k
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision add0
      double precision add1
      double precision adpsim
      double precision adpsimh
      double precision adpsimi
      double precision adpsip
      double precision adpsiph
      double precision adpsipi
      double precision adrj
      double precision adrjm
      double precision adrjp
      double precision adthetam
      double precision adthetap
      double precision adwcfl
      double precision adwloc
      double precision adwth
      double precision adwti
      double precision d0
      double precision d1
      integer i
      integer j
      integer km1
      integer km2
      integer kp1
      double precision psim
      double precision psimi
      double precision psip
      double precision psipi
      double precision rj
      double precision rjm
      double precision rjp
      double precision thetam
      double precision thetap
      double precision wcfl
      double precision wloc
      double precision wth
      double precision wti

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      add0 = 0.d0
      add1 = 0.d0
      adpsim = 0.d0
      adpsip = 0.d0
      adrj = 0.d0
      adrjm = 0.d0
      adrjp = 0.d0
      adthetam = 0.d0
      adthetap = 0.d0
      adwcfl = 0.d0
      adwloc = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      km2 = max(1,k-2)
      km1 = max(1,k-1)
      kp1 = min(nr,k+1)
      do j = sny+oly, 1-oly, -1
        do i = snx+olx, 1-olx, -1
          rjp = (tracer(i,j,k)-tracer(i,j,kp1))*maskc(i,j,kp1,bi,bj)
          rj = (tracer(i,j,km1)-tracer(i,j,k))*maskc(i,j,k,bi,bj)*maskc(
     $i,j,km1,bi,bj)
          rjm = (tracer(i,j,km2)-tracer(i,j,km1))*maskc(i,j,km1,bi,bj)
          wloc = wfld(i,j)
          wcfl = abs(wloc*dtarg*recip_drc(k))
          d0 = (2.d0-wcfl)*(1.d0-wcfl)*onesixth
          d1 = (1.d0-wcfl*wcfl)*onesixth
          if (abs(rj)*thetamax .le. abs(rjm)) then
            thetap = sign(thetamax,rjm*rj)
          else
            thetap = rjm/rj
          endif
          if (abs(rj)*thetamax .le. abs(rjp)) then
            thetam = sign(thetamax,rjp*rj)
          else
            thetam = rjp/rj
          endif
          psip = d0+d1*thetap
          psip = max(0.d0,min(min(1.d0,psip),thetap*(1.d0-wcfl)/(wcfl+
     $9.9999999999999d-21)))
          psim = d0+d1*thetam
          psim = max(0.d0,min(min(1.d0,psim),thetam*(1.d0-wcfl)/(wcfl+
     $9.9999999999999d-21)))
          wth = abs(rtrans(i,j))
          wti = abs(rtrans(i,j))
          adpsim = adpsim+0.5*adwt(i,j)*(rtrans(i,j)+wti)*rj
          adpsip = adpsip-0.5*adwt(i,j)*(rtrans(i,j)-wth)*rj
          adrj = adrj+adwt(i,j)*(0.5*(rtrans(i,j)+wti)*psim-0.5*(rtrans(
     $i,j)-wth)*psip)
          adrtrans(i,j) = adrtrans(i,j)+adwt(i,j)*(0.5*(tracer(i,j,k)+
     $psim*rj)+0.5*(tracer(i,j,km1)-psip*rj))
          adtracer(i,j,k) = adtracer(i,j,k)+0.5*adwt(i,j)*(rtrans(i,j)+
     $wti)
          adtracer(i,j,km1) = adtracer(i,j,km1)+0.5*adwt(i,j)*(rtrans(i,
     $j)-wth)
          adwth = (-0.5)*adwt(i,j)*(tracer(i,j,km1)-psip*rj)
          adwti = 0.5*adwt(i,j)*(tracer(i,j,k)+psim*rj)
          adrtrans(i,j) = adrtrans(i,j)+adwti*sign(1.d0,rtrans(i,j))
          adrtrans(i,j) = adrtrans(i,j)+adwth*sign(1.d0,rtrans(i,j))
          adwt(i,j) = 0.d0
          psim = d0+d1*thetam
          psimi = min(1.d0,psim)
          adpsimh = adpsim*(0.5-sign(0.5d0,0.d0-min(psimi,thetam*(1.d0-
     $wcfl)/(wcfl+9.9999999999999d-21))))
          adpsimi = adpsimh*(0.5+sign(0.5d0,thetam*(1.d0-wcfl)/(wcfl+
     $9.9999999999999d-21)-psimi))
          adthetam = adthetam+adpsimh*(0.5-sign(0.5d0,thetam*(1.d0-wcfl)
     $/(wcfl+9.9999999999999d-21)-psimi))*((1.d0-wcfl)/(
     $9.9999999999999d-21+wcfl))
          adwcfl = adwcfl-adpsimh*(0.5-sign(0.5d0,thetam*(1.d0-wcfl)/(
     $wcfl+9.9999999999999d-21)-psimi))*(thetam/(9.9999999999999d-21+
     $wcfl)+thetam*(1.d0-wcfl)/((9.9999999999999d-21+wcfl)*(
     $9.9999999999999d-21+wcfl)))
          adpsim = adpsimi*(0.5-sign(0.5d0,psim-1.d0))
          add0 = add0+adpsim
          add1 = add1+adpsim*thetam
          adthetam = adthetam+adpsim*d1
          adpsim = 0.d0
          psip = d0+d1*thetap
          psipi = min(1.d0,psip)
          adpsiph = adpsip*(0.5-sign(0.5d0,0.d0-min(psipi,thetap*(1.d0-
     $wcfl)/(wcfl+9.9999999999999d-21))))
          adpsipi = adpsiph*(0.5+sign(0.5d0,thetap*(1.d0-wcfl)/(wcfl+
     $9.9999999999999d-21)-psipi))
          adthetap = adthetap+adpsiph*(0.5-sign(0.5d0,thetap*(1.d0-wcfl)
     $/(wcfl+9.9999999999999d-21)-psipi))*((1.d0-wcfl)/(
     $9.9999999999999d-21+wcfl))
          adwcfl = adwcfl-adpsiph*(0.5-sign(0.5d0,thetap*(1.d0-wcfl)/(
     $wcfl+9.9999999999999d-21)-psipi))*(thetap/(9.9999999999999d-21+
     $wcfl)+thetap*(1.d0-wcfl)/((9.9999999999999d-21+wcfl)*(
     $9.9999999999999d-21+wcfl)))
          adpsip = adpsipi*(0.5-sign(0.5d0,psip-1.d0))
          add0 = add0+adpsip
          add1 = add1+adpsip*thetap
          adthetap = adthetap+adpsip*d1
          adpsip = 0.d0
          if (abs(rj)*thetamax .le. abs(rjp)) then
            adthetam = 0.d0
          else
            adrj = adrj-adthetam*(rjp/(rj*rj))
            adrjp = adrjp+adthetam/rj
            adthetam = 0.d0
          endif
          if (abs(rj)*thetamax .le. abs(rjm)) then
            adthetap = 0.d0
          else
            adrj = adrj-adthetap*(rjm/(rj*rj))
            adrjm = adrjm+adthetap/rj
            adthetap = 0.d0
          endif
          adwcfl = adwcfl-2*add1*wcfl*onesixth
          add1 = 0.d0
          adwcfl = adwcfl+add0*((-(2.d0-wcfl))-(1.d0-wcfl))*onesixth
          add0 = 0.d0
          adwloc = adwloc+adwcfl*dtarg*recip_drc(k)*sign(1.d0,wloc*
     $dtarg*recip_drc(k))
          adwcfl = 0.d0
          adwfld(i,j) = adwfld(i,j)+adwloc
          adwloc = 0.d0
          adtracer(i,j,km1) = adtracer(i,j,km1)-adrjm*maskc(i,j,km1,bi,
     $bj)
          adtracer(i,j,km2) = adtracer(i,j,km2)+adrjm*maskc(i,j,km1,bi,
     $bj)
          adrjm = 0.d0
          adtracer(i,j,k) = adtracer(i,j,k)-adrj*maskc(i,j,k,bi,bj)*
     $maskc(i,j,km1,bi,bj)
          adtracer(i,j,km1) = adtracer(i,j,km1)+adrj*maskc(i,j,k,bi,bj)*
     $maskc(i,j,km1,bi,bj)
          adrj = 0.d0
          adtracer(i,j,k) = adtracer(i,j,k)+adrjp*maskc(i,j,kp1,bi,bj)
          adtracer(i,j,kp1) = adtracer(i,j,kp1)-adrjp*maskc(i,j,kp1,bi,
     $bj)
          adrjp = 0.d0
        end do
      end do

      end

      subroutine adgad_dst3fl_adv_x( bi, bj, k, calccfl, deltatloc, 
     $utrans, adutrans, ufld, adufld, masklocw, tracer, adtracer, adut )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision onesixth
      parameter ( onesixth = 1.d0/6.d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )
      double precision thetamax
      parameter ( thetamax = 1.d+20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adut(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      logical calccfl
      double precision deltatloc
      integer k
      double precision masklocw(1-olx:snx+olx,1-oly:sny+oly)
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision add0
      double precision add1
      double precision adpsim
      double precision adpsimh
      double precision adpsimi
      double precision adpsip
      double precision adpsiph
      double precision adpsipi
      double precision adrj
      double precision adrjm
      double precision adrjp
      double precision adthetam
      double precision adthetap
      double precision aducfl
      double precision aduth
      double precision aduti
      double precision d0
      double precision d1
      integer i
      integer j
      double precision psim
      double precision psimi
      double precision psip
      double precision psipi
      double precision rj
      double precision rjm
      double precision rjp
      double precision thetam
      double precision thetap
      double precision ucfl
      double precision uth
      double precision uti

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      add0 = 0.d0
      add1 = 0.d0
      adpsim = 0.d0
      adpsip = 0.d0
      adrj = 0.d0
      adrjm = 0.d0
      adrjp = 0.d0
      adthetam = 0.d0
      adthetap = 0.d0
      aducfl = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = sny+oly, 1-oly, -1
        do i = snx+olx-1, 1-olx+2, -1
          rjp = (tracer(i+1,j)-tracer(i,j))*masklocw(i+1,j)
          rj = (tracer(i,j)-tracer(i-1,j))*masklocw(i,j)
          rjm = (tracer(i-1,j)-tracer(i-2,j))*masklocw(i-1,j)
          ucfl = ufld(i,j)
          if (calccfl) then
            ucfl = abs(ufld(i,j)*deltatloc*recip_dxc(i,j,bi,bj)*
     $recip_deepfacc(k))
          endif
          d0 = (2.d0-ucfl)*(1.d0-ucfl)*onesixth
          d1 = (1.d0-ucfl*ucfl)*onesixth
          if (abs(rj)*thetamax .le. abs(rjm)) then
            thetap = sign(thetamax,rjm*rj)
          else
            thetap = rjm/rj
          endif
          if (abs(rj)*thetamax .le. abs(rjp)) then
            thetam = sign(thetamax,rjp*rj)
          else
            thetam = rjp/rj
          endif
          psip = d0+d1*thetap
          psip = max(0.d0,min(min(1.d0,psip),thetap*(1.d0-ucfl)/(ucfl+
     $9.9999999999999d-21)))
          psim = d0+d1*thetam
          psim = max(0.d0,min(min(1.d0,psim),thetam*(1.d0-ucfl)/(ucfl+
     $9.9999999999999d-21)))
          uth = abs(utrans(i,j))
          uti = abs(utrans(i,j))
          adpsim = adpsim-0.5*adut(i,j)*(utrans(i,j)-uth)*rj
          adpsip = adpsip+0.5*adut(i,j)*(utrans(i,j)+uti)*rj
          adrj = adrj+adut(i,j)*(0.5*(utrans(i,j)+uti)*psip-0.5*(utrans(
     $i,j)-uth)*psim)
          adtracer(i-1,j) = adtracer(i-1,j)+0.5*adut(i,j)*(utrans(i,j)+
     $uti)
          adtracer(i,j) = adtracer(i,j)+0.5*adut(i,j)*(utrans(i,j)-uth)
          aduth = (-0.5)*adut(i,j)*(tracer(i,j)-psim*rj)
          aduti = 0.5*adut(i,j)*(tracer(i-1,j)+psip*rj)
          adutrans(i,j) = adutrans(i,j)+adut(i,j)*(0.5*(tracer(i-1,j)+
     $psip*rj)+0.5*(tracer(i,j)-psim*rj))
          adutrans(i,j) = adutrans(i,j)+aduti*sign(1.d0,utrans(i,j))
          adutrans(i,j) = adutrans(i,j)+aduth*sign(1.d0,utrans(i,j))
          adut(i,j) = 0.d0
          psim = d0+d1*thetam
          psimi = min(1.d0,psim)
          adpsimh = adpsim*(0.5-sign(0.5d0,0.d0-min(psimi,thetam*(1.d0-
     $ucfl)/(ucfl+9.9999999999999d-21))))
          adpsimi = adpsimh*(0.5+sign(0.5d0,thetam*(1.d0-ucfl)/(ucfl+
     $9.9999999999999d-21)-psimi))
          adthetam = adthetam+adpsimh*(0.5-sign(0.5d0,thetam*(1.d0-ucfl)
     $/(ucfl+9.9999999999999d-21)-psimi))*((1.d0-ucfl)/(
     $9.9999999999999d-21+ucfl))
          aducfl = aducfl-adpsimh*(0.5-sign(0.5d0,thetam*(1.d0-ucfl)/(
     $ucfl+9.9999999999999d-21)-psimi))*(thetam/(9.9999999999999d-21+
     $ucfl)+thetam*(1.d0-ucfl)/((9.9999999999999d-21+ucfl)*(
     $9.9999999999999d-21+ucfl)))
          adpsim = adpsimi*(0.5-sign(0.5d0,psim-1.d0))
          add0 = add0+adpsim
          add1 = add1+adpsim*thetam
          adthetam = adthetam+adpsim*d1
          adpsim = 0.d0
          psip = d0+d1*thetap
          psipi = min(1.d0,psip)
          adpsiph = adpsip*(0.5-sign(0.5d0,0.d0-min(psipi,thetap*(1.d0-
     $ucfl)/(ucfl+9.9999999999999d-21))))
          adpsipi = adpsiph*(0.5+sign(0.5d0,thetap*(1.d0-ucfl)/(ucfl+
     $9.9999999999999d-21)-psipi))
          adthetap = adthetap+adpsiph*(0.5-sign(0.5d0,thetap*(1.d0-ucfl)
     $/(ucfl+9.9999999999999d-21)-psipi))*((1.d0-ucfl)/(
     $9.9999999999999d-21+ucfl))
          aducfl = aducfl-adpsiph*(0.5-sign(0.5d0,thetap*(1.d0-ucfl)/(
     $ucfl+9.9999999999999d-21)-psipi))*(thetap/(9.9999999999999d-21+
     $ucfl)+thetap*(1.d0-ucfl)/((9.9999999999999d-21+ucfl)*(
     $9.9999999999999d-21+ucfl)))
          adpsip = adpsipi*(0.5-sign(0.5d0,psip-1.d0))
          add0 = add0+adpsip
          add1 = add1+adpsip*thetap
          adthetap = adthetap+adpsip*d1
          adpsip = 0.d0
          if (abs(rj)*thetamax .le. abs(rjp)) then
            adthetam = 0.d0
          else
            adrj = adrj-adthetam*(rjp/(rj*rj))
            adrjp = adrjp+adthetam/rj
            adthetam = 0.d0
          endif
          if (abs(rj)*thetamax .le. abs(rjm)) then
            adthetap = 0.d0
          else
            adrj = adrj-adthetap*(rjm/(rj*rj))
            adrjm = adrjm+adthetap/rj
            adthetap = 0.d0
          endif
          aducfl = aducfl-2*add1*ucfl*onesixth
          add1 = 0.d0
          aducfl = aducfl+add0*((-(2.d0-ucfl))-(1.d0-ucfl))*onesixth
          add0 = 0.d0
          if (calccfl) then
            adufld(i,j) = adufld(i,j)+aducfl*deltatloc*recip_dxc(i,j,bi,
     $bj)*recip_deepfacc(k)*sign(1.d0,ufld(i,j)*deltatloc*recip_dxc(i,j,
     $bi,bj)*recip_deepfacc(k))
            aducfl = 0.d0
          endif
          adufld(i,j) = adufld(i,j)+aducfl
          aducfl = 0.d0
          adtracer(i-2,j) = adtracer(i-2,j)-adrjm*masklocw(i-1,j)
          adtracer(i-1,j) = adtracer(i-1,j)+adrjm*masklocw(i-1,j)
          adrjm = 0.d0
          adtracer(i-1,j) = adtracer(i-1,j)-adrj*masklocw(i,j)
          adtracer(i,j) = adtracer(i,j)+adrj*masklocw(i,j)
          adrj = 0.d0
          adtracer(i+1,j) = adtracer(i+1,j)+adrjp*masklocw(i+1,j)
          adtracer(i,j) = adtracer(i,j)-adrjp*masklocw(i+1,j)
          adrjp = 0.d0
        end do
      end do
      do j = 1-oly, sny+oly
        adut(snx+olx,j) = 0.d0
        adut(2-olx,j) = 0.d0
        adut(1-olx,j) = 0.d0
      end do

      end

      subroutine adgad_dst3fl_adv_y( bi, bj, k, calccfl, deltatloc, 
     $vtrans, advtrans, vfld, advfld, masklocs, tracer, adtracer, advt )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision onesixth
      parameter ( onesixth = 1.d0/6.d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )
      double precision thetamax
      parameter ( thetamax = 1.d+20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advt(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      logical calccfl
      double precision deltatloc
      integer k
      double precision masklocs(1-olx:snx+olx,1-oly:sny+oly)
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision add0
      double precision add1
      double precision adpsim
      double precision adpsimh
      double precision adpsimi
      double precision adpsip
      double precision adpsiph
      double precision adpsipi
      double precision adrj
      double precision adrjm
      double precision adrjp
      double precision adthetam
      double precision adthetap
      double precision advcfl
      double precision advth
      double precision advti
      double precision d0
      double precision d1
      integer i
      integer j
      double precision psim
      double precision psimi
      double precision psip
      double precision psipi
      double precision rj
      double precision rjm
      double precision rjp
      double precision thetam
      double precision thetap
      double precision vcfl
      double precision vth
      double precision vti

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      add0 = 0.d0
      add1 = 0.d0
      adpsim = 0.d0
      adpsip = 0.d0
      adrj = 0.d0
      adrjm = 0.d0
      adrjp = 0.d0
      adthetam = 0.d0
      adthetap = 0.d0
      advcfl = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = sny+oly-1, 1-oly+2, -1
        do i = snx+olx, 1-olx, -1
          rjp = (tracer(i,j+1)-tracer(i,j))*masklocs(i,j+1)
          rj = (tracer(i,j)-tracer(i,j-1))*masklocs(i,j)
          rjm = (tracer(i,j-1)-tracer(i,j-2))*masklocs(i,j-1)
          vcfl = vfld(i,j)
          if (calccfl) then
            vcfl = abs(vfld(i,j)*deltatloc*recip_dyc(i,j,bi,bj)*
     $recip_deepfacc(k))
          endif
          d0 = (2.d0-vcfl)*(1.d0-vcfl)*onesixth
          d1 = (1.d0-vcfl*vcfl)*onesixth
          if (abs(rj)*thetamax .le. abs(rjm)) then
            thetap = sign(thetamax,rjm*rj)
          else
            thetap = rjm/rj
          endif
          if (abs(rj)*thetamax .le. abs(rjp)) then
            thetam = sign(thetamax,rjp*rj)
          else
            thetam = rjp/rj
          endif
          psip = d0+d1*thetap
          psip = max(0.d0,min(min(1.d0,psip),thetap*(1.d0-vcfl)/(vcfl+
     $9.9999999999999d-21)))
          psim = d0+d1*thetam
          psim = max(0.d0,min(min(1.d0,psim),thetam*(1.d0-vcfl)/(vcfl+
     $9.9999999999999d-21)))
          vth = abs(vtrans(i,j))
          vti = abs(vtrans(i,j))
          adpsim = adpsim-0.5*advt(i,j)*(vtrans(i,j)-vth)*rj
          adpsip = adpsip+0.5*advt(i,j)*(vtrans(i,j)+vti)*rj
          adrj = adrj+advt(i,j)*(0.5*(vtrans(i,j)+vti)*psip-0.5*(vtrans(
     $i,j)-vth)*psim)
          adtracer(i,j-1) = adtracer(i,j-1)+0.5*advt(i,j)*(vtrans(i,j)+
     $vti)
          adtracer(i,j) = adtracer(i,j)+0.5*advt(i,j)*(vtrans(i,j)-vth)
          advth = (-0.5)*advt(i,j)*(tracer(i,j)-psim*rj)
          advti = 0.5*advt(i,j)*(tracer(i,j-1)+psip*rj)
          advtrans(i,j) = advtrans(i,j)+advt(i,j)*(0.5*(tracer(i,j-1)+
     $psip*rj)+0.5*(tracer(i,j)-psim*rj))
          advtrans(i,j) = advtrans(i,j)+advti*sign(1.d0,vtrans(i,j))
          advtrans(i,j) = advtrans(i,j)+advth*sign(1.d0,vtrans(i,j))
          advt(i,j) = 0.d0
          psim = d0+d1*thetam
          psimi = min(1.d0,psim)
          adpsimh = adpsim*(0.5-sign(0.5d0,0.d0-min(psimi,thetam*(1.d0-
     $vcfl)/(vcfl+9.9999999999999d-21))))
          adpsimi = adpsimh*(0.5+sign(0.5d0,thetam*(1.d0-vcfl)/(vcfl+
     $9.9999999999999d-21)-psimi))
          adthetam = adthetam+adpsimh*(0.5-sign(0.5d0,thetam*(1.d0-vcfl)
     $/(vcfl+9.9999999999999d-21)-psimi))*((1.d0-vcfl)/(
     $9.9999999999999d-21+vcfl))
          advcfl = advcfl-adpsimh*(0.5-sign(0.5d0,thetam*(1.d0-vcfl)/(
     $vcfl+9.9999999999999d-21)-psimi))*(thetam/(9.9999999999999d-21+
     $vcfl)+thetam*(1.d0-vcfl)/((9.9999999999999d-21+vcfl)*(
     $9.9999999999999d-21+vcfl)))
          adpsim = adpsimi*(0.5-sign(0.5d0,psim-1.d0))
          add0 = add0+adpsim
          add1 = add1+adpsim*thetam
          adthetam = adthetam+adpsim*d1
          adpsim = 0.d0
          psip = d0+d1*thetap
          psipi = min(1.d0,psip)
          adpsiph = adpsip*(0.5-sign(0.5d0,0.d0-min(psipi,thetap*(1.d0-
     $vcfl)/(vcfl+9.9999999999999d-21))))
          adpsipi = adpsiph*(0.5+sign(0.5d0,thetap*(1.d0-vcfl)/(vcfl+
     $9.9999999999999d-21)-psipi))
          adthetap = adthetap+adpsiph*(0.5-sign(0.5d0,thetap*(1.d0-vcfl)
     $/(vcfl+9.9999999999999d-21)-psipi))*((1.d0-vcfl)/(
     $9.9999999999999d-21+vcfl))
          advcfl = advcfl-adpsiph*(0.5-sign(0.5d0,thetap*(1.d0-vcfl)/(
     $vcfl+9.9999999999999d-21)-psipi))*(thetap/(9.9999999999999d-21+
     $vcfl)+thetap*(1.d0-vcfl)/((9.9999999999999d-21+vcfl)*(
     $9.9999999999999d-21+vcfl)))
          adpsip = adpsipi*(0.5-sign(0.5d0,psip-1.d0))
          add0 = add0+adpsip
          add1 = add1+adpsip*thetap
          adthetap = adthetap+adpsip*d1
          adpsip = 0.d0
          if (abs(rj)*thetamax .le. abs(rjp)) then
            adthetam = 0.d0
          else
            adrj = adrj-adthetam*(rjp/(rj*rj))
            adrjp = adrjp+adthetam/rj
            adthetam = 0.d0
          endif
          if (abs(rj)*thetamax .le. abs(rjm)) then
            adthetap = 0.d0
          else
            adrj = adrj-adthetap*(rjm/(rj*rj))
            adrjm = adrjm+adthetap/rj
            adthetap = 0.d0
          endif
          advcfl = advcfl-2*add1*vcfl*onesixth
          add1 = 0.d0
          advcfl = advcfl+add0*((-(2.d0-vcfl))-(1.d0-vcfl))*onesixth
          add0 = 0.d0
          if (calccfl) then
            advfld(i,j) = advfld(i,j)+advcfl*deltatloc*recip_dyc(i,j,bi,
     $bj)*recip_deepfacc(k)*sign(1.d0,vfld(i,j)*deltatloc*recip_dyc(i,j,
     $bi,bj)*recip_deepfacc(k))
            advcfl = 0.d0
          endif
          advfld(i,j) = advfld(i,j)+advcfl
          advcfl = 0.d0
          adtracer(i,j-2) = adtracer(i,j-2)-adrjm*masklocs(i,j-1)
          adtracer(i,j-1) = adtracer(i,j-1)+adrjm*masklocs(i,j-1)
          adrjm = 0.d0
          adtracer(i,j-1) = adtracer(i,j-1)-adrj*masklocs(i,j)
          adtracer(i,j) = adtracer(i,j)+adrj*masklocs(i,j)
          adrj = 0.d0
          adtracer(i,j+1) = adtracer(i,j+1)+adrjp*masklocs(i,j+1)
          adtracer(i,j) = adtracer(i,j)-adrjp*masklocs(i,j+1)
          adrjp = 0.d0
        end do
      end do
      do i = 1-olx, snx+olx
        advt(i,sny+oly) = 0.d0
        advt(i,2-oly) = 0.d0
        advt(i,1-oly) = 0.d0
      end do

      end

      subroutine adgad_fluxlimit_adv_r( bi, bj, k, dtarg, rtrans, 
     $adrtrans, wfld, adwfld, tracer, adtracer, adwt )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adrtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adwt(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision dtarg
      integer k
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adcr
      double precision adcrh
      double precision adcri
      double precision adcrj
      double precision adrj
      double precision adrjm
      double precision adrjp
      double precision adwcfl
      double precision adwloc
      double precision adwth
      double precision cr
      double precision cri
      double precision crj
      integer i
      integer j
      integer km1
      integer km2
      integer kp1
      double precision rj
      double precision rjm
      double precision rjp
      double precision wcfl
      double precision wloc
      double precision wth

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adcr = 0.d0
      adrj = 0.d0
      adrjm = 0.d0
      adrjp = 0.d0
      adwcfl = 0.d0
      adwloc = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      km2 = max(1,k-2)
      km1 = max(1,k-1)
      kp1 = min(nr,k+1)
      if (k .gt. nr) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adwt(i,j) = 0.d0
          end do
        end do
      else
        do j = sny+oly, 1-oly, -1
          do i = snx+olx, 1-olx, -1
            wloc = wfld(i,j)
            wcfl = abs(wloc*dtarg*recip_drc(k))
            rjp = (tracer(i,j,kp1)-tracer(i,j,k))*maskc(i,j,kp1,bi,bj)
            rj = tracer(i,j,k)-tracer(i,j,km1)
            rjm = (tracer(i,j,km1)-tracer(i,j,km2))*maskc(i,j,km2,bi,bj)
            if (rj .ne. 0.) then
              if (rtrans(i,j) .lt. 0.) then
                cr = rjm/rj
              else
                cr = rjp/rj
              endif
            else
              if (rtrans(i,j) .lt. 0.) then
                cr = rjm*1.e+20
              else
                cr = rjp*1.e+20
              endif
            endif
            cr = max(0.d0,max(min(1.d0,2.d0*cr),min(2.d0,cr)))
            wth = abs(rtrans(i,j))
            adcr = adcr+0.5d0*adwt(i,j)*maskc(i,j,km1,bi,bj)*wth*((-1)+
     $wcfl)*rj
            adrj = adrj+0.5d0*adwt(i,j)*maskc(i,j,km1,bi,bj)*wth*(1.-cr+
     $wcfl*cr)
            adrtrans(i,j) = adrtrans(i,j)+0.5d0*adwt(i,j)*maskc(i,j,km1,
     $bi,bj)*(tracer(i,j,k)+tracer(i,j,km1))
            adtracer(i,j,k) = adtracer(i,j,k)+0.5d0*adwt(i,j)*maskc(i,j,
     $km1,bi,bj)*rtrans(i,j)
            adtracer(i,j,km1) = adtracer(i,j,km1)+0.5d0*adwt(i,j)*maskc(
     $i,j,km1,bi,bj)*rtrans(i,j)
            adwcfl = adwcfl+0.5d0*adwt(i,j)*maskc(i,j,km1,bi,bj)*wth*cr*
     $rj
            adwth = 0.5d0*adwt(i,j)*maskc(i,j,km1,bi,bj)*(1.-cr+wcfl*cr)
     $*rj
            adrtrans(i,j) = adrtrans(i,j)+adwth*sign(1.d0,rtrans(i,j))
            adwt(i,j) = 0.d0
            if (rj .ne. 0.) then
              if (rtrans(i,j) .lt. 0.) then
                cr = rjm/rj
              else
                cr = rjp/rj
              endif
            else
              if (rtrans(i,j) .lt. 0.) then
                cr = rjm*1.e+20
              else
                cr = rjp*1.e+20
              endif
            endif
            cri = min(1.d0,2.d0*cr)
            crj = min(2.d0,cr)
            adcrh = adcr*(0.5-sign(0.5d0,0.d0-max(cri,crj)))
            adcri = adcrh*(0.5+sign(0.5d0,cri-crj))
            adcrj = adcrh*(0.5-sign(0.5d0,cri-crj))
            adcr = adcrj*(0.5-sign(0.5d0,cr-2.d0))
            adcr = 2*adcri*(0.5-sign(0.5d0,2.d0*cr-1.d0))
            if (rj .ne. 0.) then
              if (rtrans(i,j) .lt. 0.) then
                adrj = adrj-adcr*(rjm/(rj*rj))
                adrjm = adrjm+adcr/rj
                adcr = 0.d0
              else
                adrj = adrj-adcr*(rjp/(rj*rj))
                adrjp = adrjp+adcr/rj
                adcr = 0.d0
              endif
            else
              if (rtrans(i,j) .lt. 0.) then
                adrjm = adrjm+1.e+20*adcr
                adcr = 0.d0
              else
                adrjp = adrjp+1.e+20*adcr
                adcr = 0.d0
              endif
            endif
            adtracer(i,j,km1) = adtracer(i,j,km1)+adrjm*maskc(i,j,km2,
     $bi,bj)
            adtracer(i,j,km2) = adtracer(i,j,km2)-adrjm*maskc(i,j,km2,
     $bi,bj)
            adrjm = 0.d0
            adtracer(i,j,k) = adtracer(i,j,k)+adrj
            adtracer(i,j,km1) = adtracer(i,j,km1)-adrj
            adrj = 0.d0
            adtracer(i,j,k) = adtracer(i,j,k)-adrjp*maskc(i,j,kp1,bi,bj)
            adtracer(i,j,kp1) = adtracer(i,j,kp1)+adrjp*maskc(i,j,kp1,
     $bi,bj)
            adrjp = 0.d0
            adwloc = adwloc+adwcfl*dtarg*recip_drc(k)*sign(1.d0,wloc*
     $dtarg*recip_drc(k))
            adwcfl = 0.d0
            adwfld(i,j) = adwfld(i,j)+adwloc
            adwloc = 0.d0
          end do
        end do
      endif

      end

      subroutine adgad_fluxlimit_adv_x( bi, bj, k, calccfl, deltatloc, 
     $utrans, adutrans, ufld, adufld, masklocw, tracer, adtracer, adut )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adut(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      logical calccfl
      double precision deltatloc
      integer k
      double precision masklocw(1-olx:snx+olx,1-oly:sny+oly)
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adcr
      double precision adcrh
      double precision adcri
      double precision adcrj
      double precision adrj
      double precision adrjm
      double precision adrjp
      double precision aducfl
      double precision aduth
      double precision cr
      double precision cri
      double precision crj
      integer i
      integer j
      double precision rj
      double precision rjm
      double precision rjp
      double precision ucfl
      double precision uth

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adcr = 0.d0
      adrj = 0.d0
      adrjm = 0.d0
      adrjp = 0.d0
      aducfl = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = sny+oly, 1-oly, -1
        do i = snx+olx-1, 1-olx+2, -1
          ucfl = ufld(i,j)
          if (calccfl) then
            ucfl = abs(ufld(i,j)*deltatloc*recip_dxc(i,j,bi,bj)*
     $recip_deepfacc(k))
          endif
          rjp = (tracer(i+1,j)-tracer(i,j))*masklocw(i+1,j)
          rj = (tracer(i,j)-tracer(i-1,j))*masklocw(i,j)
          rjm = (tracer(i-1,j)-tracer(i-2,j))*masklocw(i-1,j)
          if (rj .ne. 0.) then
            if (utrans(i,j) .gt. 0) then
              cr = rjm/rj
            else
              cr = rjp/rj
            endif
          else
            if (utrans(i,j) .gt. 0) then
              cr = rjm*1.e+20
            else
              cr = rjp*1.e+20
            endif
          endif
          cr = max(0.d0,max(min(1.d0,2.d0*cr),min(2.d0,cr)))
          uth = abs(utrans(i,j))
          adcr = adcr-0.5d0*adut(i,j)*uth*((-1)+ucfl)*rj
          adrj = adrj-0.5d0*adut(i,j)*uth*(1.-cr+ucfl*cr)
          adtracer(i-1,j) = adtracer(i-1,j)+0.5d0*adut(i,j)*utrans(i,j)
          adtracer(i,j) = adtracer(i,j)+0.5d0*adut(i,j)*utrans(i,j)
          aducfl = aducfl-0.5d0*adut(i,j)*uth*cr*rj
          aduth = -(0.5d0*adut(i,j)*(1.-cr+ucfl*cr)*rj)
          adutrans(i,j) = adutrans(i,j)+0.5d0*adut(i,j)*(tracer(i,j)+
     $tracer(i-1,j))
          adutrans(i,j) = adutrans(i,j)+aduth*sign(1.d0,utrans(i,j))
          adut(i,j) = 0.d0
          if (rj .ne. 0.) then
            if (utrans(i,j) .gt. 0) then
              cr = rjm/rj
            else
              cr = rjp/rj
            endif
          else
            if (utrans(i,j) .gt. 0) then
              cr = rjm*1.e+20
            else
              cr = rjp*1.e+20
            endif
          endif
          cri = min(1.d0,2.d0*cr)
          crj = min(2.d0,cr)
          adcrh = adcr*(0.5-sign(0.5d0,0.d0-max(cri,crj)))
          adcri = adcrh*(0.5+sign(0.5d0,cri-crj))
          adcrj = adcrh*(0.5-sign(0.5d0,cri-crj))
          adcr = adcrj*(0.5-sign(0.5d0,cr-2.d0))
          adcr = 2*adcri*(0.5-sign(0.5d0,2.d0*cr-1.d0))
          if (rj .ne. 0.) then
            if (utrans(i,j) .gt. 0) then
              adrj = adrj-adcr*(rjm/(rj*rj))
              adrjm = adrjm+adcr/rj
              adcr = 0.d0
            else
              adrj = adrj-adcr*(rjp/(rj*rj))
              adrjp = adrjp+adcr/rj
              adcr = 0.d0
            endif
          else
            if (utrans(i,j) .gt. 0) then
              adrjm = adrjm+1.e+20*adcr
              adcr = 0.d0
            else
              adrjp = adrjp+1.e+20*adcr
              adcr = 0.d0
            endif
          endif
          adtracer(i-2,j) = adtracer(i-2,j)-adrjm*masklocw(i-1,j)
          adtracer(i-1,j) = adtracer(i-1,j)+adrjm*masklocw(i-1,j)
          adrjm = 0.d0
          adtracer(i-1,j) = adtracer(i-1,j)-adrj*masklocw(i,j)
          adtracer(i,j) = adtracer(i,j)+adrj*masklocw(i,j)
          adrj = 0.d0
          adtracer(i+1,j) = adtracer(i+1,j)+adrjp*masklocw(i+1,j)
          adtracer(i,j) = adtracer(i,j)-adrjp*masklocw(i+1,j)
          adrjp = 0.d0
          if (calccfl) then
            adufld(i,j) = adufld(i,j)+aducfl*deltatloc*recip_dxc(i,j,bi,
     $bj)*recip_deepfacc(k)*sign(1.d0,ufld(i,j)*deltatloc*recip_dxc(i,j,
     $bi,bj)*recip_deepfacc(k))
            aducfl = 0.d0
          endif
          adufld(i,j) = adufld(i,j)+aducfl
          aducfl = 0.d0
        end do
      end do
      do j = 1-oly, sny+oly
        adut(snx+olx,j) = 0.d0
        adut(2-olx,j) = 0.d0
        adut(1-olx,j) = 0.d0
      end do

      end

      subroutine adgad_fluxlimit_adv_y( bi, bj, k, calccfl, deltatloc, 
     $vtrans, advtrans, vfld, advfld, masklocs, tracer, adtracer, advt )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advt(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      logical calccfl
      double precision deltatloc
      integer k
      double precision masklocs(1-olx:snx+olx,1-oly:sny+oly)
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adcr
      double precision adcrh
      double precision adcri
      double precision adcrj
      double precision adrj
      double precision adrjm
      double precision adrjp
      double precision advcfl
      double precision advth
      double precision cr
      double precision cri
      double precision crj
      integer i
      integer j
      double precision rj
      double precision rjm
      double precision rjp
      double precision vcfl
      double precision vth

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adcr = 0.d0
      adrj = 0.d0
      adrjm = 0.d0
      adrjp = 0.d0
      advcfl = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = sny+oly-1, 1-oly+2, -1
        do i = snx+olx, 1-olx, -1
          vcfl = vfld(i,j)
          if (calccfl) then
            vcfl = abs(vfld(i,j)*deltatloc*recip_dyc(i,j,bi,bj)*
     $recip_deepfacc(k))
          endif
          rjp = (tracer(i,j+1)-tracer(i,j))*masklocs(i,j+1)
          rj = (tracer(i,j)-tracer(i,j-1))*masklocs(i,j)
          rjm = (tracer(i,j-1)-tracer(i,j-2))*masklocs(i,j-1)
          if (rj .ne. 0.) then
            if (vtrans(i,j) .gt. 0) then
              cr = rjm/rj
            else
              cr = rjp/rj
            endif
          else
            if (vtrans(i,j) .gt. 0) then
              cr = rjm*1.e+20
            else
              cr = rjp*1.e+20
            endif
          endif
          cr = max(0.d0,max(min(1.d0,2.d0*cr),min(2.d0,cr)))
          vth = abs(vtrans(i,j))
          adcr = adcr-0.5d0*advt(i,j)*vth*((-1)+vcfl)*rj
          adrj = adrj-0.5d0*advt(i,j)*vth*(1.-cr+vcfl*cr)
          adtracer(i,j-1) = adtracer(i,j-1)+0.5d0*advt(i,j)*vtrans(i,j)
          adtracer(i,j) = adtracer(i,j)+0.5d0*advt(i,j)*vtrans(i,j)
          advcfl = advcfl-0.5d0*advt(i,j)*vth*cr*rj
          advth = -(0.5d0*advt(i,j)*(1.-cr+vcfl*cr)*rj)
          advtrans(i,j) = advtrans(i,j)+0.5d0*advt(i,j)*(tracer(i,j)+
     $tracer(i,j-1))
          advtrans(i,j) = advtrans(i,j)+advth*sign(1.d0,vtrans(i,j))
          advt(i,j) = 0.d0
          if (rj .ne. 0.) then
            if (vtrans(i,j) .gt. 0) then
              cr = rjm/rj
            else
              cr = rjp/rj
            endif
          else
            if (vtrans(i,j) .gt. 0) then
              cr = rjm*1.e+20
            else
              cr = rjp*1.e+20
            endif
          endif
          cri = min(1.d0,2.d0*cr)
          crj = min(2.d0,cr)
          adcrh = adcr*(0.5-sign(0.5d0,0.d0-max(cri,crj)))
          adcri = adcrh*(0.5+sign(0.5d0,cri-crj))
          adcrj = adcrh*(0.5-sign(0.5d0,cri-crj))
          adcr = adcrj*(0.5-sign(0.5d0,cr-2.d0))
          adcr = 2*adcri*(0.5-sign(0.5d0,2.d0*cr-1.d0))
          if (rj .ne. 0.) then
            if (vtrans(i,j) .gt. 0) then
              adrj = adrj-adcr*(rjm/(rj*rj))
              adrjm = adrjm+adcr/rj
              adcr = 0.d0
            else
              adrj = adrj-adcr*(rjp/(rj*rj))
              adrjp = adrjp+adcr/rj
              adcr = 0.d0
            endif
          else
            if (vtrans(i,j) .gt. 0) then
              adrjm = adrjm+1.e+20*adcr
              adcr = 0.d0
            else
              adrjp = adrjp+1.e+20*adcr
              adcr = 0.d0
            endif
          endif
          adtracer(i,j-2) = adtracer(i,j-2)-adrjm*masklocs(i,j-1)
          adtracer(i,j-1) = adtracer(i,j-1)+adrjm*masklocs(i,j-1)
          adrjm = 0.d0
          adtracer(i,j-1) = adtracer(i,j-1)-adrj*masklocs(i,j)
          adtracer(i,j) = adtracer(i,j)+adrj*masklocs(i,j)
          adrj = 0.d0
          adtracer(i,j+1) = adtracer(i,j+1)+adrjp*masklocs(i,j+1)
          adtracer(i,j) = adtracer(i,j)-adrjp*masklocs(i,j+1)
          adrjp = 0.d0
          if (calccfl) then
            advfld(i,j) = advfld(i,j)+advcfl*deltatloc*recip_dyc(i,j,bi,
     $bj)*recip_deepfacc(k)*sign(1.d0,vfld(i,j)*deltatloc*recip_dyc(i,j,
     $bi,bj)*recip_deepfacc(k))
            advcfl = 0.d0
          endif
          advfld(i,j) = advfld(i,j)+advcfl
          advcfl = 0.d0
        end do
      end do
      do i = 1-olx, snx+olx
        advt(i,sny+oly) = 0.d0
        advt(i,2-oly) = 0.d0
        advt(i,1-oly) = 0.d0
      end do

      end

      subroutine adgad_grad_x( bi, bj, k, xa, adtracer, addtdx )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision addtdx(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly, sny+oly
        do i = 1-olx+1, snx+olx
          adtracer(i-1,j) = adtracer(i-1,j)-addtdx(i,j)*xa(i,j)*
     $recip_dxc(i,j,bi,bj)*recip_deepfacc(k)*sqcosfacu(j,bi,bj)
          adtracer(i,j) = adtracer(i,j)+addtdx(i,j)*xa(i,j)*recip_dxc(i,
     $j,bi,bj)*recip_deepfacc(k)*sqcosfacu(j,bi,bj)
          addtdx(i,j) = 0.d0
        end do
        addtdx(1-olx,j) = 0.d0
      end do
      if (usecubedsphereexchange) then
        call adfill_cs_corner_tr_rl( 1, .false. ,adtracer )
      endif

      end

      subroutine adgad_grad_y( bi, bj, k, ya, adtracer, addtdy )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision addtdy(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly+1, sny+oly
        do i = 1-olx, snx+olx
          adtracer(i,j-1) = adtracer(i,j-1)-addtdy(i,j)*ya(i,j)*
     $recip_dyc(i,j,bi,bj)*recip_deepfacc(k)
          adtracer(i,j) = adtracer(i,j)+addtdy(i,j)*ya(i,j)*recip_dyc(i,
     $j,bi,bj)*recip_deepfacc(k)
          addtdy(i,j) = 0.d0
        end do
      end do
      if (usecubedsphereexchange) then
        call adfill_cs_corner_tr_rl( 2, .false. ,adtracer )
      endif

      end

      subroutine adgad_os7mp_adv_r( bi, bj, k, deltatloc, wtrans, 
     $adwtrans, wfld, adwfld, q, adq, adwt )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adq(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adwt(1-olx:snx+olx,1-oly:sny+oly)
      double precision adwtrans(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision deltatloc
      integer k
      double precision q(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision wtrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision a
      double precision ada
      double precision adb
      double precision adc
      double precision adcfl
      double precision add
      double precision add2
      double precision add2m1
      double precision add2p1
      double precision addel2
      double precision addel2m
      double precision addel2mm
      double precision addel2p
      double precision addel2pp
      double precision addel3m
      double precision addel3mm
      double precision addel3p
      double precision addel3pp
      double precision addel4
      double precision addel4m
      double precision addel4p
      double precision addel5m
      double precision addel5p
      double precision addel6
      double precision addeli
      double precision addelip
      double precision addelm
      double precision addelmm
      double precision addelmmm
      double precision addelp
      double precision addelpp
      double precision addm1h
      double precision addm1hi
      double precision addm1hj
      double precision addm1hk
      double precision addm1hm
      double precision addm1hn
      double precision addm1ho
      double precision addp1h
      double precision addp1hi
      double precision addp1hj
      double precision addp1hk
      double precision addp1hm
      double precision addp1hn
      double precision addp1ho
      double precision adfac
      double precision adphi
      double precision adphih
      double precision adphilc
      double precision adphimax
      double precision adphimaxh
      double precision adphimaxk
      double precision adphimd
      double precision adphimin
      double precision adphimink
      double precision adpsi
      double precision adqi
      double precision adqim
      double precision adqimm
      double precision adqimmm
      double precision adqip
      double precision adqipp
      double precision adrecip_deli
      double precision adrecip_delii
      double precision adrecip_delip
      double precision adrecip_delipi
      double precision adrp1h
      double precision adrp1h_cfl
      double precision adwloc
      double precision b
      double precision c
      double precision cfl
      double precision d
      double precision d2
      double precision d2m1
      double precision d2p1
      double precision del2
      double precision del2m
      double precision del2mm
      double precision del2p
      double precision del2pp
      double precision del3m
      double precision del3mm
      double precision del3p
      double precision del3pp
      double precision del4
      double precision del4m
      double precision del4p
      double precision del5m
      double precision del5p
      double precision del6
      double precision deli
      double precision delip
      double precision delm
      double precision delmm
      double precision delmmm
      double precision delp
      double precision delpp
      double precision dm1h
      double precision dm1hi
      double precision dm1hj
      double precision dm1hm
      double precision dm1hn
      double precision dp1h
      double precision dp1hi
      double precision dp1hj
      double precision dp1hm
      double precision dp1hn
      double precision eps
      double precision fac
      integer i
      integer j
      integer km1
      integer km2
      integer km3
      integer km4
      integer kp1
      integer kp2
      integer kp3
      double precision mski
      double precision mskim
      double precision mskimm
      double precision mskimmm
      double precision mskip
      double precision phi
      double precision phih
      double precision philc
      double precision phimax
      double precision phimaxh
      double precision phimaxi
      double precision phimaxj
      double precision phimaxk
      double precision phimd
      double precision phimin
      double precision phiminh
      double precision phimini
      double precision phiminj
      double precision phimink
      double precision psi
      double precision qi
      double precision qim
      double precision qimm
      double precision qimmm
      double precision qip
      double precision qipp
      double precision recip_deli
      double precision recip_delih
      double precision recip_delii
      double precision recip_delip
      double precision recip_deliph
      double precision recip_delipi
      double precision rp1h
      double precision rp1h_cfl
      double precision wloc

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      ada = 0.d0
      adb = 0.d0
      adc = 0.d0
      adcfl = 0.d0
      add = 0.d0
      add2 = 0.d0
      add2m1 = 0.d0
      add2p1 = 0.d0
      addel2 = 0.d0
      addel2m = 0.d0
      addel2mm = 0.d0
      addel2p = 0.d0
      addel2pp = 0.d0
      addel3m = 0.d0
      addel3mm = 0.d0
      addel3p = 0.d0
      addel3pp = 0.d0
      addel4 = 0.d0
      addel4m = 0.d0
      addel4p = 0.d0
      addel5m = 0.d0
      addel5p = 0.d0
      addel6 = 0.d0
      addeli = 0.d0
      addelip = 0.d0
      addelm = 0.d0
      addelmm = 0.d0
      addelmmm = 0.d0
      addelp = 0.d0
      addelpp = 0.d0
      addm1h = 0.d0
      addp1h = 0.d0
      adfac = 0.d0
      adphi = 0.d0
      adphilc = 0.d0
      adphimax = 0.d0
      adphimd = 0.d0
      adphimin = 0.d0
      adpsi = 0.d0
      adqi = 0.d0
      adqim = 0.d0
      adqimm = 0.d0
      adqimmm = 0.d0
      adqip = 0.d0
      adqipp = 0.d0
      adrecip_deli = 0.d0
      adrecip_delip = 0.d0
      adrp1h = 0.d0
      adrp1h_cfl = 0.d0
      adwloc = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      eps = 9.9999999999999d-21
      km4 = max(1,k-4)
      km3 = max(1,k-3)
      km2 = max(1,k-2)
      km1 = max(1,k-1)
      kp1 = min(nr,k+1)
      kp2 = min(nr,k+2)
      kp3 = min(nr,k+3)
      do j = sny+oly, 1-oly, -1
        do i = snx+olx, 1-olx, -1
          wloc = wfld(i,j)
          cfl = abs(wloc*deltatloc*recip_drc(k))
          if (wtrans(i,j) .lt. 0.d0) then
            qipp = q(i,j,kp1)
            qip = q(i,j,k)
            qi = q(i,j,km1)
            qim = q(i,j,km2)
            qimm = q(i,j,km3)
            qimmm = q(i,j,km4)
            mskip = maskc(i,j,kp1,bi,bj)*float(kp1-k)
            mski = maskc(i,j,k,bi,bj)*float(k-km1)
            mskim = maskc(i,j,km1,bi,bj)*float(km1-km2)
            mskimm = maskc(i,j,km2,bi,bj)*float(km2-km3)
            mskimmm = maskc(i,j,km3,bi,bj)*float(km3-km4)
          else if (wtrans(i,j) .gt. 0.d0) then
            qipp = q(i,j,km2)
            qip = q(i,j,km1)
            qi = q(i,j,k)
            qim = q(i,j,kp1)
            qimm = q(i,j,kp2)
            qimmm = q(i,j,kp3)
            mskip = maskc(i,j,km1,bi,bj)*float(km1-km2)
            mski = maskc(i,j,k,bi,bj)*float(k-km1)
            mskim = maskc(i,j,kp1,bi,bj)*float(kp1-k)
            mskimm = maskc(i,j,kp2,bi,bj)*float(kp2-kp1)
            mskimmm = maskc(i,j,kp3,bi,bj)*float(kp3-kp2)
          else
            qipp = 0.d0
            qip = 0.d0
            qi = 0.d0
            qim = 0.d0
            qimm = 0.d0
            qimmm = 0.d0
            mskip = 0.d0
            mski = 0.d0
            mskim = 0.d0
            mskimm = 0.d0
            mskimmm = 0.d0
          endif
          if (wtrans(i,j) .ne. 0.d0) then
            fac = 1.d0
            delp = (qip-qi)*mski
            phi = fac*delp
            fac = fac*(cfl+1.d0)/3.d0
            delm = (qi-qim)*mskim
            del2 = delp-delm
            phi = phi-fac*del2
            fac = fac*(cfl-2.d0)/4.d0
            delpp = (qipp-qip)*mskip*mski
            del2p = delpp-delp
            del3p = del2p-del2
            phi = phi+fac*del3p
            fac = fac*(cfl-3.d0)/5.d0
            delmm = (qim-qimm)*mskimm*mskim
            del2m = delm-delmm
            del3m = del2-del2m
            del4 = del3p-del3m
            phi = phi+fac*del4
            fac = fac*(cfl+2.d0)/6.d0
            del2pp = delpp-delp
            del3pp = del2pp-del2p
            del4p = del3pp-del3p
            del5p = del4p-del4
            phi = phi+fac*del5p
            fac = fac*(cfl+2.d0)/7.d0
            delmmm = (qimm-qimmm)*mskimmm*mskimm*mskim
            del2mm = delmm-delmmm
            del3mm = del2m-del2mm
            del4m = del3m-del3mm
            del5m = del4-del4m
            del6 = del5p-del5m
            phi = phi-fac*del6
            delip = (qip-qi)*mski
            recip_delip = sign(1.d0,delip)/max(abs(delip),eps)
            phi = phi*recip_delip
            deli = (qi-qim)*mskim
            recip_deli = sign(1.d0,deli)/max(abs(deli),eps)
            rp1h = deli*recip_delip
            rp1h_cfl = rp1h/(cfl+eps)
            d2 = del2
            d2p1 = del2p
            d2m1 = del2m
            a = 4.d0*d2-d2p1
            b = 4.d0*d2p1-d2
            c = d2
            d = d2p1
            dp1h = max(min(a,b,c,d),0.d0)+min(max(a,b,c,d),0.d0)
            a = 4.d0*d2m1-d2
            b = 4.d0*d2-d2m1
            c = d2m1
            d = d2
            dm1h = max(min(a,b,c,d),0.d0)+min(max(a,b,c,d),0.d0)
            phimd = 1.d0/(1.d0-cfl)*(delip-dp1h)*recip_delip
            philc = rp1h_cfl*(1.d0+dm1h*recip_deli)
            phimin = max(min(0.d0,phimd),min(0.d0,2.d0*rp1h_cfl,philc))
            phimax = min(max(2.d0/(1.d0-cfl),phimd),max(0.d0,2.d0*
     $rp1h_cfl,philc))
            phi = max(phimin,min(phi,phimax))
            psi = phi*0.5d0*(1.d0-cfl)
            addelip = addelip+adwt(i,j)*wtrans(i,j)*psi
            adpsi = adpsi+adwt(i,j)*wtrans(i,j)*delip
            adqi = adqi+adwt(i,j)*wtrans(i,j)
            adwtrans(i,j) = adwtrans(i,j)+adwt(i,j)*(qi+psi*delip)
            adwt(i,j) = 0.d0
            adcfl = adcfl-0.5d0*adpsi*phi
            adphi = adphi+0.5d0*adpsi*(1.d0-cfl)
            adpsi = 0.d0
            fac = 1.d0
            phi = fac*delp
            fac = fac*(cfl+1.d0)/3.d0
            phi = phi-fac*del2
            fac = fac*(cfl-2.d0)/4.d0
            phi = phi+fac*del3p
            fac = fac*(cfl-3.d0)/5.d0
            phi = phi+fac*del4
            fac = fac*(cfl+2.d0)/6.d0
            phi = phi+fac*del5p
            fac = fac*(cfl+2.d0)/7.d0
            phi = phi-fac*del6
            phi = phi*recip_delip
            phih = min(phi,phimax)
            adphih = adphi*(0.5-sign(0.5d0,phimin-phih))
            adphimin = adphimin+adphi*(0.5+sign(0.5d0,phimin-phih))
            adphi = adphih*(0.5+sign(0.5d0,phimax-phi))
            adphimax = adphimax+adphih*(0.5-sign(0.5d0,phimax-phi))
            phimaxh = max(2.d0/(1.d0-cfl),phimd)
            phimaxi = 2.d0*rp1h_cfl
            phimaxj = max(0.d0,phimaxi)
            phimaxk = max(phimaxj,philc)
            adphimaxh = adphimax*(0.5+sign(0.5d0,phimaxk-phimaxh))
            adphimaxk = adphimax*(0.5-sign(0.5d0,phimaxk-phimaxh))
            adphilc = adphilc+adphimaxk*(0.5-sign(0.5d0,phimaxj-philc))
            adrp1h_cfl = adrp1h_cfl+2*adphimaxk*(0.5+sign(0.5d0,phimaxj-
     $philc))*(0.5-sign(0.5d0,0.d0-phimaxi))
            adcfl = adcfl-adphimaxh*(0.5+sign(0.5d0,2.d0/(1.d0-cfl)-
     $phimd))*((-2)/((1.d0-cfl)*(1.d0-cfl)))
            adphimd = adphimd+adphimaxh*(0.5-sign(0.5d0,2.d0/(1.d0-cfl)-
     $phimd))
            adphimax = 0.d0
            phiminh = min(0.d0,phimd)
            phimini = 2.d0*rp1h_cfl
            phiminj = min(0.d0,phimini)
            phimink = min(phiminj,philc)
            adphimink = adphimin*(0.5-sign(0.5d0,phiminh-phimink))
            adphilc = adphilc+adphimink*(0.5-sign(0.5d0,philc-phiminj))
            adrp1h_cfl = adrp1h_cfl+2*adphimink*(0.5+sign(0.5d0,philc-
     $phiminj))*(0.5-sign(0.5d0,phimini-0.d0))
            adphimd = adphimd+adphimin*(0.5+sign(0.5d0,phiminh-phimink))
     $*(0.5-sign(0.5d0,phimd-0.d0))
            adphimin = 0.d0
            addm1h = addm1h+adphilc*rp1h_cfl*recip_deli
            adrecip_deli = adrecip_deli+adphilc*rp1h_cfl*dm1h
            adrp1h_cfl = adrp1h_cfl+adphilc*(1+dm1h*recip_deli)
            adphilc = 0.d0
            adcfl = adcfl-(-(adphimd/((1.d0-cfl)*(1.d0-cfl))))*(delip-
     $dp1h)*recip_delip
            addelip = addelip+adphimd*1.d0/(1.d0-cfl)*recip_delip
            addp1h = addp1h-adphimd*1.d0/(1.d0-cfl)*recip_delip
            adrecip_delip = adrecip_delip+adphimd*1.d0/(1.d0-cfl)*(
     $delip-dp1h)
            adphimd = 0.d0
            dm1hi = max(a,b)
            dm1hj = max(dm1hi,c)
            dm1hm = min(a,b)
            dm1hn = min(dm1hm,c)
            addm1ho = addm1h*(0.5+sign(0.5d0,min(dm1hn,d)-0.d0))
            add = add+addm1ho*(0.5-sign(0.5d0,d-dm1hn))
            addm1hn = addm1ho*(0.5+sign(0.5d0,d-dm1hn))
            adc = adc+addm1hn*(0.5-sign(0.5d0,c-dm1hm))
            addm1hm = addm1hn*(0.5+sign(0.5d0,c-dm1hm))
            ada = ada+addm1hm*(0.5+sign(0.5d0,b-a))
            adb = adb+addm1hm*(0.5-sign(0.5d0,b-a))
            addm1hk = addm1h*(0.5+sign(0.5d0,0.d0-max(dm1hj,d)))
            add = add+addm1hk*(0.5-sign(0.5d0,dm1hj-d))
            addm1hj = addm1hk*(0.5+sign(0.5d0,dm1hj-d))
            adc = adc+addm1hj*(0.5-sign(0.5d0,dm1hi-c))
            addm1hi = addm1hj*(0.5+sign(0.5d0,dm1hi-c))
            ada = ada+addm1hi*(0.5+sign(0.5d0,a-b))
            adb = adb+addm1hi*(0.5-sign(0.5d0,a-b))
            addm1h = 0.d0
            add2 = add2+add
            add = 0.d0
            add2m1 = add2m1+adc
            adc = 0.d0
            add2 = add2+4*adb
            add2m1 = add2m1-adb
            adb = 0.d0
            add2 = add2-ada
            add2m1 = add2m1+4*ada
            ada = 0.d0
            a = 4.d0*d2-d2p1
            b = 4.d0*d2p1-d2
            c = d2
            d = d2p1
            dp1hi = max(a,b)
            dp1hj = max(dp1hi,c)
            dp1hm = min(a,b)
            dp1hn = min(dp1hm,c)
            addp1ho = addp1h*(0.5+sign(0.5d0,min(dp1hn,d)-0.d0))
            add = add+addp1ho*(0.5-sign(0.5d0,d-dp1hn))
            addp1hn = addp1ho*(0.5+sign(0.5d0,d-dp1hn))
            adc = adc+addp1hn*(0.5-sign(0.5d0,c-dp1hm))
            addp1hm = addp1hn*(0.5+sign(0.5d0,c-dp1hm))
            ada = ada+addp1hm*(0.5+sign(0.5d0,b-a))
            adb = adb+addp1hm*(0.5-sign(0.5d0,b-a))
            addp1hk = addp1h*(0.5+sign(0.5d0,0.d0-max(dp1hj,d)))
            add = add+addp1hk*(0.5-sign(0.5d0,dp1hj-d))
            addp1hj = addp1hk*(0.5+sign(0.5d0,dp1hj-d))
            adc = adc+addp1hj*(0.5-sign(0.5d0,dp1hi-c))
            addp1hi = addp1hj*(0.5+sign(0.5d0,dp1hi-c))
            ada = ada+addp1hi*(0.5+sign(0.5d0,a-b))
            adb = adb+addp1hi*(0.5-sign(0.5d0,a-b))
            addp1h = 0.d0
            add2p1 = add2p1+add
            add = 0.d0
            add2 = add2+adc
            adc = 0.d0
            add2 = add2-adb
            add2p1 = add2p1+4*adb
            adb = 0.d0
            add2 = add2+4*ada
            add2p1 = add2p1-ada
            ada = 0.d0
            addel2m = addel2m+add2m1
            add2m1 = 0.d0
            addel2p = addel2p+add2p1
            add2p1 = 0.d0
            addel2 = addel2+add2
            add2 = 0.d0
            adcfl = adcfl-adrp1h_cfl*(rp1h/((cfl+eps)*(cfl+eps)))
            adrp1h = adrp1h+adrp1h_cfl/(cfl+eps)
            adrp1h_cfl = 0.d0
            addeli = addeli+adrp1h*recip_delip
            adrecip_delip = adrecip_delip+adrp1h*deli
            adrp1h = 0.d0
            recip_delii = abs(deli)
            recip_delih = max(recip_delii,eps)
            adrecip_delii = -(adrecip_deli*sign(1.d0,deli)/(recip_delih*
     $recip_delih)*(0.5+sign(0.5d0,recip_delii-eps)))
            addeli = addeli+adrecip_delii*sign(1.d0,deli)
            adrecip_deli = 0.d0
            adqi = adqi+addeli*mskim
            adqim = adqim-addeli*mskim
            addeli = 0.d0
            fac = 1.d0
            phi = fac*delp
            fac = fac*(cfl+1.d0)/3.d0
            phi = phi-fac*del2
            fac = fac*(cfl-2.d0)/4.d0
            phi = phi+fac*del3p
            fac = fac*(cfl-3.d0)/5.d0
            phi = phi+fac*del4
            fac = fac*(cfl+2.d0)/6.d0
            phi = phi+fac*del5p
            fac = fac*(cfl+2.d0)/7.d0
            phi = phi-fac*del6
            adrecip_delip = adrecip_delip+adphi*phi
            adphi = adphi*recip_delip
            recip_delipi = abs(delip)
            recip_deliph = max(recip_delipi,eps)
            adrecip_delipi = -(adrecip_delip*sign(1.d0,delip)/(
     $recip_deliph*recip_deliph)*(0.5+sign(0.5d0,recip_delipi-eps)))
            addelip = addelip+adrecip_delipi*sign(1.d0,delip)
            adrecip_delip = 0.d0
            adqi = adqi-addelip*mski
            adqip = adqip+addelip*mski
            addelip = 0.d0
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            fac = fac*(cfl-3.d0)/5.d0
            fac = fac*(cfl+2.d0)/6.d0
            fac = fac*(cfl+2.d0)/7.d0
            addel6 = addel6-adphi*fac
            adfac = adfac-adphi*del6
            addel5m = addel5m-addel6
            addel5p = addel5p+addel6
            addel6 = 0.d0
            addel4 = addel4+addel5m
            addel4m = addel4m-addel5m
            addel5m = 0.d0
            addel3m = addel3m+addel4m
            addel3mm = addel3mm-addel4m
            addel4m = 0.d0
            addel2m = addel2m+addel3mm
            addel2mm = addel2mm-addel3mm
            addel3mm = 0.d0
            addelmm = addelmm+addel2mm
            addelmmm = addelmmm-addel2mm
            addel2mm = 0.d0
            adqimm = adqimm+addelmmm*mskimmm*mskimm*mskim
            adqimmm = adqimmm-addelmmm*mskimmm*mskimm*mskim
            addelmmm = 0.d0
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            fac = fac*(cfl-3.d0)/5.d0
            fac = fac*(cfl+2.d0)/6.d0
            adcfl = adcfl+adfac*(fac/7.d0)
            adfac = adfac*((2+cfl)/7.d0)
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            fac = fac*(cfl-3.d0)/5.d0
            fac = fac*(cfl+2.d0)/6.d0
            addel5p = addel5p+adphi*fac
            adfac = adfac+adphi*del5p
            addel4 = addel4-addel5p
            addel4p = addel4p+addel5p
            addel5p = 0.d0
            addel3p = addel3p-addel4p
            addel3pp = addel3pp+addel4p
            addel4p = 0.d0
            addel2p = addel2p-addel3pp
            addel2pp = addel2pp+addel3pp
            addel3pp = 0.d0
            addelp = addelp-addel2pp
            addelpp = addelpp+addel2pp
            addel2pp = 0.d0
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            fac = fac*(cfl-3.d0)/5.d0
            adcfl = adcfl+adfac*(fac/6.d0)
            adfac = adfac*((2+cfl)/6.d0)
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            fac = fac*(cfl-3.d0)/5.d0
            addel4 = addel4+adphi*fac
            adfac = adfac+adphi*del4
            addel3m = addel3m-addel4
            addel3p = addel3p+addel4
            addel4 = 0.d0
            addel2 = addel2+addel3m
            addel2m = addel2m-addel3m
            addel3m = 0.d0
            addelm = addelm+addel2m
            addelmm = addelmm-addel2m
            addel2m = 0.d0
            adqim = adqim+addelmm*mskimm*mskim
            adqimm = adqimm-addelmm*mskimm*mskim
            addelmm = 0.d0
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            adcfl = adcfl+adfac*(fac/5.d0)
            adfac = adfac*(((-3)+cfl)/5.d0)
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            addel3p = addel3p+adphi*fac
            adfac = adfac+adphi*del3p
            addel2 = addel2-addel3p
            addel2p = addel2p+addel3p
            addel3p = 0.d0
            addelp = addelp-addel2p
            addelpp = addelpp+addel2p
            addel2p = 0.d0
            adqip = adqip-addelpp*mskip*mski
            adqipp = adqipp+addelpp*mskip*mski
            addelpp = 0.d0
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            adcfl = adcfl+adfac*(fac/4.d0)
            adfac = adfac*(((-2)+cfl)/4.d0)
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            addel2 = addel2-adphi*fac
            adfac = adfac-adphi*del2
            addelm = addelm-addel2
            addelp = addelp+addel2
            addel2 = 0.d0
            adqi = adqi+addelm*mskim
            adqim = adqim-addelm*mskim
            addelm = 0.d0
            fac = 1.d0
            adcfl = adcfl+adfac*(fac/3.d0)
            adfac = adfac*((1+cfl)/3.d0)
            fac = 1.d0
            addelp = addelp+adphi*fac
            adfac = adfac+adphi*delp
            adphi = 0.d0
            adqi = adqi-addelp*mski
            adqip = adqip+addelp*mski
            addelp = 0.d0
            adfac = 0.d0
          else
            adwt(i,j) = 0.d0
          endif
          if (wtrans(i,j) .lt. 0.d0) then
            adq(i,j,km4) = adq(i,j,km4)+adqimmm
            adqimmm = 0.d0
            adq(i,j,km3) = adq(i,j,km3)+adqimm
            adqimm = 0.d0
            adq(i,j,km2) = adq(i,j,km2)+adqim
            adqim = 0.d0
            adq(i,j,km1) = adq(i,j,km1)+adqi
            adqi = 0.d0
            adq(i,j,k) = adq(i,j,k)+adqip
            adqip = 0.d0
            adq(i,j,kp1) = adq(i,j,kp1)+adqipp
            adqipp = 0.d0
          else if (wtrans(i,j) .gt. 0.d0) then
            adq(i,j,kp3) = adq(i,j,kp3)+adqimmm
            adqimmm = 0.d0
            adq(i,j,kp2) = adq(i,j,kp2)+adqimm
            adqimm = 0.d0
            adq(i,j,kp1) = adq(i,j,kp1)+adqim
            adqim = 0.d0
            adq(i,j,k) = adq(i,j,k)+adqi
            adqi = 0.d0
            adq(i,j,km1) = adq(i,j,km1)+adqip
            adqip = 0.d0
            adq(i,j,km2) = adq(i,j,km2)+adqipp
            adqipp = 0.d0
          else
            adqimmm = 0.d0
            adqimm = 0.d0
            adqim = 0.d0
            adqi = 0.d0
            adqip = 0.d0
            adqipp = 0.d0
          endif
          adwloc = adwloc+adcfl*deltatloc*recip_drc(k)*sign(1.d0,wloc*
     $deltatloc*recip_drc(k))
          adcfl = 0.d0
          adwfld(i,j) = adwfld(i,j)+adwloc
          adwloc = 0.d0
        end do
      end do

      end

      subroutine adgad_os7mp_adv_x( bi, bj, calccfl, deltatloc, utrans, 
     $adutrans, ufld, adufld, masklocw, q, adq, adut )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adq(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adut(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      logical calccfl
      double precision deltatloc
      double precision masklocw(1-olx:snx+olx,1-oly:sny+oly)
      double precision q(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision a
      double precision ada
      double precision adb
      double precision adc
      double precision adcfl
      double precision add
      double precision add2
      double precision add2m1
      double precision add2p1
      double precision addel2
      double precision addel2m
      double precision addel2mm
      double precision addel2p
      double precision addel2pp
      double precision addel3m
      double precision addel3mm
      double precision addel3p
      double precision addel3pp
      double precision addel4
      double precision addel4m
      double precision addel4p
      double precision addel5m
      double precision addel5p
      double precision addel6
      double precision addeli
      double precision addelip
      double precision addelm
      double precision addelmm
      double precision addelmmm
      double precision addelp
      double precision addelpp
      double precision addm1h
      double precision addm1hi
      double precision addm1hj
      double precision addm1hk
      double precision addm1hm
      double precision addm1hn
      double precision addm1ho
      double precision addp1h
      double precision addp1hi
      double precision addp1hj
      double precision addp1hk
      double precision addp1hm
      double precision addp1hn
      double precision addp1ho
      double precision adfac
      double precision adphi
      double precision adphih
      double precision adphilc
      double precision adphimax
      double precision adphimaxh
      double precision adphimaxk
      double precision adphimd
      double precision adphimin
      double precision adphimink
      double precision adpsi
      double precision adqi
      double precision adqim
      double precision adqimm
      double precision adqimmm
      double precision adqip
      double precision adqipp
      double precision adrecip_deli
      double precision adrecip_delii
      double precision adrecip_delip
      double precision adrecip_delipi
      double precision adrp1h
      double precision adrp1h_cfl
      double precision aduloc
      double precision b
      double precision c
      double precision cfl
      double precision d
      double precision d2
      double precision d2m1
      double precision d2p1
      double precision del2
      double precision del2m
      double precision del2mm
      double precision del2p
      double precision del2pp
      double precision del3m
      double precision del3mm
      double precision del3p
      double precision del3pp
      double precision del4
      double precision del4m
      double precision del4p
      double precision del5m
      double precision del5p
      double precision del6
      double precision deli
      double precision delip
      double precision delm
      double precision delmm
      double precision delmmm
      double precision delp
      double precision delpp
      double precision dm1h
      double precision dm1hi
      double precision dm1hj
      double precision dm1hm
      double precision dm1hn
      double precision dp1h
      double precision dp1hi
      double precision dp1hj
      double precision dp1hm
      double precision dp1hn
      double precision eps
      double precision fac
      integer i
      integer j
      double precision mski
      double precision mskim
      double precision mskimm
      double precision mskimmm
      double precision mskip
      double precision phi
      double precision phih
      double precision philc
      double precision phimax
      double precision phimaxh
      double precision phimaxi
      double precision phimaxj
      double precision phimaxk
      double precision phimd
      double precision phimin
      double precision phiminh
      double precision phimini
      double precision phiminj
      double precision phimink
      double precision psi
      double precision qi
      double precision qim
      double precision qimm
      double precision qimmm
      double precision qip
      double precision qipp
      double precision recip_deli
      double precision recip_delih
      double precision recip_delii
      double precision recip_delip
      double precision recip_deliph
      double precision recip_delipi
      double precision rp1h
      double precision rp1h_cfl
      double precision uloc

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      ada = 0.d0
      adb = 0.d0
      adc = 0.d0
      adcfl = 0.d0
      add = 0.d0
      add2 = 0.d0
      add2m1 = 0.d0
      add2p1 = 0.d0
      addel2 = 0.d0
      addel2m = 0.d0
      addel2mm = 0.d0
      addel2p = 0.d0
      addel2pp = 0.d0
      addel3m = 0.d0
      addel3mm = 0.d0
      addel3p = 0.d0
      addel3pp = 0.d0
      addel4 = 0.d0
      addel4m = 0.d0
      addel4p = 0.d0
      addel5m = 0.d0
      addel5p = 0.d0
      addel6 = 0.d0
      addeli = 0.d0
      addelip = 0.d0
      addelm = 0.d0
      addelmm = 0.d0
      addelmmm = 0.d0
      addelp = 0.d0
      addelpp = 0.d0
      addm1h = 0.d0
      addp1h = 0.d0
      adfac = 0.d0
      adphi = 0.d0
      adphilc = 0.d0
      adphimax = 0.d0
      adphimd = 0.d0
      adphimin = 0.d0
      adpsi = 0.d0
      adqi = 0.d0
      adqim = 0.d0
      adqimm = 0.d0
      adqimmm = 0.d0
      adqip = 0.d0
      adqipp = 0.d0
      adrecip_deli = 0.d0
      adrecip_delip = 0.d0
      adrp1h = 0.d0
      adrp1h_cfl = 0.d0
      aduloc = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      eps = 9.9999999999999d-21
      do j = sny+oly, 1-oly, -1
        do i = snx+olx-3, 1-olx+4, -1
          uloc = ufld(i,j)
          cfl = uloc
          if (calccfl) then
            cfl = abs(uloc*deltatloc*recip_dxc(i,j,bi,bj))
          endif
          if (utrans(i,j) .gt. 0.d0) then
            qipp = q(i+1,j)
            qip = q(i,j)
            qi = q(i-1,j)
            qim = q(i-2,j)
            qimm = q(i-3,j)
            qimmm = q(i-4,j)
            mskip = masklocw(i+1,j)
            mski = masklocw(i,j)
            mskim = masklocw(i-1,j)
            mskimm = masklocw(i-2,j)
            mskimmm = masklocw(i-3,j)
          else if (utrans(i,j) .lt. 0.d0) then
            qipp = q(i-2,j)
            qip = q(i-1,j)
            qi = q(i,j)
            qim = q(i+1,j)
            qimm = q(i+2,j)
            qimmm = q(i+3,j)
            mskip = masklocw(i-1,j)
            mski = masklocw(i,j)
            mskim = masklocw(i+1,j)
            mskimm = masklocw(i+2,j)
            mskimmm = masklocw(i+3,j)
          else
            qipp = 0.d0
            qip = 0.d0
            qi = 0.d0
            qim = 0.d0
            qimm = 0.d0
            qimmm = 0.d0
            mskip = 0.d0
            mski = 0.d0
            mskim = 0.d0
            mskimm = 0.d0
            mskimmm = 0.d0
          endif
          if (utrans(i,j) .ne. 0.d0) then
            fac = 1.d0
            delp = (qip-qi)*mski
            phi = fac*delp
            fac = fac*(cfl+1.d0)/3.d0
            delm = (qi-qim)*mskim
            del2 = delp-delm
            phi = phi-fac*del2
            fac = fac*(cfl-2.d0)/4.d0
            delpp = (qipp-qip)*mskip*mski
            del2p = delpp-delp
            del3p = del2p-del2
            phi = phi+fac*del3p
            fac = fac*(cfl-3.d0)/5.d0
            delmm = (qim-qimm)*mskimm*mskim
            del2m = delm-delmm
            del3m = del2-del2m
            del4 = del3p-del3m
            phi = phi+fac*del4
            fac = fac*(cfl+2.d0)/6.d0
            del2pp = delpp-delp
            del3pp = del2pp-del2p
            del4p = del3pp-del3p
            del5p = del4p-del4
            phi = phi+fac*del5p
            fac = fac*(cfl+2.d0)/7.d0
            delmmm = (qimm-qimmm)*mskimmm*mskimm*mskim
            del2mm = delmm-delmmm
            del3mm = del2m-del2mm
            del4m = del3m-del3mm
            del5m = del4-del4m
            del6 = del5p-del5m
            phi = phi-fac*del6
            delip = (qip-qi)*mski
            recip_delip = sign(1.d0,delip)/max(abs(delip),eps)
            phi = phi*recip_delip
            deli = (qi-qim)*mskim
            recip_deli = sign(1.d0,deli)/max(abs(deli),eps)
            rp1h = deli*recip_delip
            rp1h_cfl = rp1h/(cfl+eps)
            d2 = del2
            d2p1 = del2p
            d2m1 = del2m
            a = 4.d0*d2-d2p1
            b = 4.d0*d2p1-d2
            c = d2
            d = d2p1
            dp1h = max(min(a,b,c,d),0.d0)+min(max(a,b,c,d),0.d0)
            a = 4.d0*d2m1-d2
            b = 4.d0*d2-d2m1
            c = d2m1
            d = d2
            dm1h = max(min(a,b,c,d),0.d0)+min(max(a,b,c,d),0.d0)
            phimd = 1.d0/(1.d0-cfl)*(delip-dp1h)*recip_delip
            philc = rp1h_cfl*(1.d0+dm1h*recip_deli)
            phimin = max(min(0.d0,phimd),min(0.d0,2.d0*rp1h_cfl,philc))
            phimax = min(max(2.d0/(1.d0-cfl),phimd),max(0.d0,2.d0*
     $rp1h_cfl,philc))
            phi = max(phimin,min(phi,phimax))
            psi = phi*0.5d0*(1.d0-cfl)
            addelip = addelip+adut(i,j)*utrans(i,j)*psi
            adpsi = adpsi+adut(i,j)*utrans(i,j)*delip
            adqi = adqi+adut(i,j)*utrans(i,j)
            adutrans(i,j) = adutrans(i,j)+adut(i,j)*(qi+psi*delip)
            adut(i,j) = 0.d0
            adcfl = adcfl-0.5d0*adpsi*phi
            adphi = adphi+0.5d0*adpsi*(1.d0-cfl)
            adpsi = 0.d0
            fac = 1.d0
            phi = fac*delp
            fac = fac*(cfl+1.d0)/3.d0
            phi = phi-fac*del2
            fac = fac*(cfl-2.d0)/4.d0
            phi = phi+fac*del3p
            fac = fac*(cfl-3.d0)/5.d0
            phi = phi+fac*del4
            fac = fac*(cfl+2.d0)/6.d0
            phi = phi+fac*del5p
            fac = fac*(cfl+2.d0)/7.d0
            phi = phi-fac*del6
            phi = phi*recip_delip
            phih = min(phi,phimax)
            adphih = adphi*(0.5-sign(0.5d0,phimin-phih))
            adphimin = adphimin+adphi*(0.5+sign(0.5d0,phimin-phih))
            adphi = adphih*(0.5+sign(0.5d0,phimax-phi))
            adphimax = adphimax+adphih*(0.5-sign(0.5d0,phimax-phi))
            phimaxh = max(2.d0/(1.d0-cfl),phimd)
            phimaxi = 2.d0*rp1h_cfl
            phimaxj = max(0.d0,phimaxi)
            phimaxk = max(phimaxj,philc)
            adphimaxh = adphimax*(0.5+sign(0.5d0,phimaxk-phimaxh))
            adphimaxk = adphimax*(0.5-sign(0.5d0,phimaxk-phimaxh))
            adphilc = adphilc+adphimaxk*(0.5-sign(0.5d0,phimaxj-philc))
            adrp1h_cfl = adrp1h_cfl+2*adphimaxk*(0.5+sign(0.5d0,phimaxj-
     $philc))*(0.5-sign(0.5d0,0.d0-phimaxi))
            adcfl = adcfl-adphimaxh*(0.5+sign(0.5d0,2.d0/(1.d0-cfl)-
     $phimd))*((-2)/((1.d0-cfl)*(1.d0-cfl)))
            adphimd = adphimd+adphimaxh*(0.5-sign(0.5d0,2.d0/(1.d0-cfl)-
     $phimd))
            adphimax = 0.d0
            phiminh = min(0.d0,phimd)
            phimini = 2.d0*rp1h_cfl
            phiminj = min(0.d0,phimini)
            phimink = min(phiminj,philc)
            adphimink = adphimin*(0.5-sign(0.5d0,phiminh-phimink))
            adphilc = adphilc+adphimink*(0.5-sign(0.5d0,philc-phiminj))
            adrp1h_cfl = adrp1h_cfl+2*adphimink*(0.5+sign(0.5d0,philc-
     $phiminj))*(0.5-sign(0.5d0,phimini-0.d0))
            adphimd = adphimd+adphimin*(0.5+sign(0.5d0,phiminh-phimink))
     $*(0.5-sign(0.5d0,phimd-0.d0))
            adphimin = 0.d0
            addm1h = addm1h+adphilc*rp1h_cfl*recip_deli
            adrecip_deli = adrecip_deli+adphilc*rp1h_cfl*dm1h
            adrp1h_cfl = adrp1h_cfl+adphilc*(1+dm1h*recip_deli)
            adphilc = 0.d0
            adcfl = adcfl-(-(adphimd/((1.d0-cfl)*(1.d0-cfl))))*(delip-
     $dp1h)*recip_delip
            addelip = addelip+adphimd*1.d0/(1.d0-cfl)*recip_delip
            addp1h = addp1h-adphimd*1.d0/(1.d0-cfl)*recip_delip
            adrecip_delip = adrecip_delip+adphimd*1.d0/(1.d0-cfl)*(
     $delip-dp1h)
            adphimd = 0.d0
            dm1hi = max(a,b)
            dm1hj = max(dm1hi,c)
            dm1hm = min(a,b)
            dm1hn = min(dm1hm,c)
            addm1ho = addm1h*(0.5+sign(0.5d0,min(dm1hn,d)-0.d0))
            add = add+addm1ho*(0.5-sign(0.5d0,d-dm1hn))
            addm1hn = addm1ho*(0.5+sign(0.5d0,d-dm1hn))
            adc = adc+addm1hn*(0.5-sign(0.5d0,c-dm1hm))
            addm1hm = addm1hn*(0.5+sign(0.5d0,c-dm1hm))
            ada = ada+addm1hm*(0.5+sign(0.5d0,b-a))
            adb = adb+addm1hm*(0.5-sign(0.5d0,b-a))
            addm1hk = addm1h*(0.5+sign(0.5d0,0.d0-max(dm1hj,d)))
            add = add+addm1hk*(0.5-sign(0.5d0,dm1hj-d))
            addm1hj = addm1hk*(0.5+sign(0.5d0,dm1hj-d))
            adc = adc+addm1hj*(0.5-sign(0.5d0,dm1hi-c))
            addm1hi = addm1hj*(0.5+sign(0.5d0,dm1hi-c))
            ada = ada+addm1hi*(0.5+sign(0.5d0,a-b))
            adb = adb+addm1hi*(0.5-sign(0.5d0,a-b))
            addm1h = 0.d0
            add2 = add2+add
            add = 0.d0
            add2m1 = add2m1+adc
            adc = 0.d0
            add2 = add2+4*adb
            add2m1 = add2m1-adb
            adb = 0.d0
            add2 = add2-ada
            add2m1 = add2m1+4*ada
            ada = 0.d0
            a = 4.d0*d2-d2p1
            b = 4.d0*d2p1-d2
            c = d2
            d = d2p1
            dp1hi = max(a,b)
            dp1hj = max(dp1hi,c)
            dp1hm = min(a,b)
            dp1hn = min(dp1hm,c)
            addp1ho = addp1h*(0.5+sign(0.5d0,min(dp1hn,d)-0.d0))
            add = add+addp1ho*(0.5-sign(0.5d0,d-dp1hn))
            addp1hn = addp1ho*(0.5+sign(0.5d0,d-dp1hn))
            adc = adc+addp1hn*(0.5-sign(0.5d0,c-dp1hm))
            addp1hm = addp1hn*(0.5+sign(0.5d0,c-dp1hm))
            ada = ada+addp1hm*(0.5+sign(0.5d0,b-a))
            adb = adb+addp1hm*(0.5-sign(0.5d0,b-a))
            addp1hk = addp1h*(0.5+sign(0.5d0,0.d0-max(dp1hj,d)))
            add = add+addp1hk*(0.5-sign(0.5d0,dp1hj-d))
            addp1hj = addp1hk*(0.5+sign(0.5d0,dp1hj-d))
            adc = adc+addp1hj*(0.5-sign(0.5d0,dp1hi-c))
            addp1hi = addp1hj*(0.5+sign(0.5d0,dp1hi-c))
            ada = ada+addp1hi*(0.5+sign(0.5d0,a-b))
            adb = adb+addp1hi*(0.5-sign(0.5d0,a-b))
            addp1h = 0.d0
            add2p1 = add2p1+add
            add = 0.d0
            add2 = add2+adc
            adc = 0.d0
            add2 = add2-adb
            add2p1 = add2p1+4*adb
            adb = 0.d0
            add2 = add2+4*ada
            add2p1 = add2p1-ada
            ada = 0.d0
            addel2m = addel2m+add2m1
            add2m1 = 0.d0
            addel2p = addel2p+add2p1
            add2p1 = 0.d0
            addel2 = addel2+add2
            add2 = 0.d0
            adcfl = adcfl-adrp1h_cfl*(rp1h/((cfl+eps)*(cfl+eps)))
            adrp1h = adrp1h+adrp1h_cfl/(cfl+eps)
            adrp1h_cfl = 0.d0
            addeli = addeli+adrp1h*recip_delip
            adrecip_delip = adrecip_delip+adrp1h*deli
            adrp1h = 0.d0
            recip_delii = abs(deli)
            recip_delih = max(recip_delii,eps)
            adrecip_delii = -(adrecip_deli*sign(1.d0,deli)/(recip_delih*
     $recip_delih)*(0.5+sign(0.5d0,recip_delii-eps)))
            addeli = addeli+adrecip_delii*sign(1.d0,deli)
            adrecip_deli = 0.d0
            adqi = adqi+addeli*mskim
            adqim = adqim-addeli*mskim
            addeli = 0.d0
            fac = 1.d0
            phi = fac*delp
            fac = fac*(cfl+1.d0)/3.d0
            phi = phi-fac*del2
            fac = fac*(cfl-2.d0)/4.d0
            phi = phi+fac*del3p
            fac = fac*(cfl-3.d0)/5.d0
            phi = phi+fac*del4
            fac = fac*(cfl+2.d0)/6.d0
            phi = phi+fac*del5p
            fac = fac*(cfl+2.d0)/7.d0
            phi = phi-fac*del6
            adrecip_delip = adrecip_delip+adphi*phi
            adphi = adphi*recip_delip
            recip_delipi = abs(delip)
            recip_deliph = max(recip_delipi,eps)
            adrecip_delipi = -(adrecip_delip*sign(1.d0,delip)/(
     $recip_deliph*recip_deliph)*(0.5+sign(0.5d0,recip_delipi-eps)))
            addelip = addelip+adrecip_delipi*sign(1.d0,delip)
            adrecip_delip = 0.d0
            adqi = adqi-addelip*mski
            adqip = adqip+addelip*mski
            addelip = 0.d0
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            fac = fac*(cfl-3.d0)/5.d0
            fac = fac*(cfl+2.d0)/6.d0
            fac = fac*(cfl+2.d0)/7.d0
            addel6 = addel6-adphi*fac
            adfac = adfac-adphi*del6
            addel5m = addel5m-addel6
            addel5p = addel5p+addel6
            addel6 = 0.d0
            addel4 = addel4+addel5m
            addel4m = addel4m-addel5m
            addel5m = 0.d0
            addel3m = addel3m+addel4m
            addel3mm = addel3mm-addel4m
            addel4m = 0.d0
            addel2m = addel2m+addel3mm
            addel2mm = addel2mm-addel3mm
            addel3mm = 0.d0
            addelmm = addelmm+addel2mm
            addelmmm = addelmmm-addel2mm
            addel2mm = 0.d0
            adqimm = adqimm+addelmmm*mskimmm*mskimm*mskim
            adqimmm = adqimmm-addelmmm*mskimmm*mskimm*mskim
            addelmmm = 0.d0
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            fac = fac*(cfl-3.d0)/5.d0
            fac = fac*(cfl+2.d0)/6.d0
            adcfl = adcfl+adfac*(fac/7.d0)
            adfac = adfac*((2+cfl)/7.d0)
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            fac = fac*(cfl-3.d0)/5.d0
            fac = fac*(cfl+2.d0)/6.d0
            addel5p = addel5p+adphi*fac
            adfac = adfac+adphi*del5p
            addel4 = addel4-addel5p
            addel4p = addel4p+addel5p
            addel5p = 0.d0
            addel3p = addel3p-addel4p
            addel3pp = addel3pp+addel4p
            addel4p = 0.d0
            addel2p = addel2p-addel3pp
            addel2pp = addel2pp+addel3pp
            addel3pp = 0.d0
            addelp = addelp-addel2pp
            addelpp = addelpp+addel2pp
            addel2pp = 0.d0
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            fac = fac*(cfl-3.d0)/5.d0
            adcfl = adcfl+adfac*(fac/6.d0)
            adfac = adfac*((2+cfl)/6.d0)
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            fac = fac*(cfl-3.d0)/5.d0
            addel4 = addel4+adphi*fac
            adfac = adfac+adphi*del4
            addel3m = addel3m-addel4
            addel3p = addel3p+addel4
            addel4 = 0.d0
            addel2 = addel2+addel3m
            addel2m = addel2m-addel3m
            addel3m = 0.d0
            addelm = addelm+addel2m
            addelmm = addelmm-addel2m
            addel2m = 0.d0
            adqim = adqim+addelmm*mskimm*mskim
            adqimm = adqimm-addelmm*mskimm*mskim
            addelmm = 0.d0
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            adcfl = adcfl+adfac*(fac/5.d0)
            adfac = adfac*(((-3)+cfl)/5.d0)
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            addel3p = addel3p+adphi*fac
            adfac = adfac+adphi*del3p
            addel2 = addel2-addel3p
            addel2p = addel2p+addel3p
            addel3p = 0.d0
            addelp = addelp-addel2p
            addelpp = addelpp+addel2p
            addel2p = 0.d0
            adqip = adqip-addelpp*mskip*mski
            adqipp = adqipp+addelpp*mskip*mski
            addelpp = 0.d0
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            adcfl = adcfl+adfac*(fac/4.d0)
            adfac = adfac*(((-2)+cfl)/4.d0)
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            addel2 = addel2-adphi*fac
            adfac = adfac-adphi*del2
            addelm = addelm-addel2
            addelp = addelp+addel2
            addel2 = 0.d0
            adqi = adqi+addelm*mskim
            adqim = adqim-addelm*mskim
            addelm = 0.d0
            fac = 1.d0
            adcfl = adcfl+adfac*(fac/3.d0)
            adfac = adfac*((1+cfl)/3.d0)
            fac = 1.d0
            addelp = addelp+adphi*fac
            adfac = adfac+adphi*delp
            adphi = 0.d0
            adqi = adqi-addelp*mski
            adqip = adqip+addelp*mski
            addelp = 0.d0
            adfac = 0.d0
          else
            adut(i,j) = 0.d0
          endif
          if (utrans(i,j) .gt. 0.d0) then
            adq(i-4,j) = adq(i-4,j)+adqimmm
            adqimmm = 0.d0
            adq(i-3,j) = adq(i-3,j)+adqimm
            adqimm = 0.d0
            adq(i-2,j) = adq(i-2,j)+adqim
            adqim = 0.d0
            adq(i-1,j) = adq(i-1,j)+adqi
            adqi = 0.d0
            adq(i,j) = adq(i,j)+adqip
            adqip = 0.d0
            adq(i+1,j) = adq(i+1,j)+adqipp
            adqipp = 0.d0
          else if (utrans(i,j) .lt. 0.d0) then
            adq(i+3,j) = adq(i+3,j)+adqimmm
            adqimmm = 0.d0
            adq(i+2,j) = adq(i+2,j)+adqimm
            adqimm = 0.d0
            adq(i+1,j) = adq(i+1,j)+adqim
            adqim = 0.d0
            adq(i,j) = adq(i,j)+adqi
            adqi = 0.d0
            adq(i-1,j) = adq(i-1,j)+adqip
            adqip = 0.d0
            adq(i-2,j) = adq(i-2,j)+adqipp
            adqipp = 0.d0
          else
            adqimmm = 0.d0
            adqimm = 0.d0
            adqim = 0.d0
            adqi = 0.d0
            adqip = 0.d0
            adqipp = 0.d0
          endif
          if (calccfl) then
            aduloc = aduloc+adcfl*deltatloc*recip_dxc(i,j,bi,bj)*sign(
     $1.d0,uloc*deltatloc*recip_dxc(i,j,bi,bj))
            adcfl = 0.d0
          endif
          aduloc = aduloc+adcfl
          adcfl = 0.d0
          adufld(i,j) = adufld(i,j)+aduloc
          aduloc = 0.d0
        end do
      end do

      end

      subroutine adgad_os7mp_adv_y( bi, bj, calccfl, deltatloc, vtrans, 
     $advtrans, vfld, advfld, masklocs, q, adq, advt )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adq(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advt(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      logical calccfl
      double precision deltatloc
      double precision masklocs(1-olx:snx+olx,1-oly:sny+oly)
      double precision q(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision a
      double precision ada
      double precision adb
      double precision adc
      double precision adcfl
      double precision add
      double precision add2
      double precision add2m1
      double precision add2p1
      double precision addel2
      double precision addel2m
      double precision addel2mm
      double precision addel2p
      double precision addel2pp
      double precision addel3m
      double precision addel3mm
      double precision addel3p
      double precision addel3pp
      double precision addel4
      double precision addel4m
      double precision addel4p
      double precision addel5m
      double precision addel5p
      double precision addel6
      double precision addeli
      double precision addelip
      double precision addelm
      double precision addelmm
      double precision addelmmm
      double precision addelp
      double precision addelpp
      double precision addm1h
      double precision addm1hi
      double precision addm1hj
      double precision addm1hk
      double precision addm1hm
      double precision addm1hn
      double precision addm1ho
      double precision addp1h
      double precision addp1hi
      double precision addp1hj
      double precision addp1hk
      double precision addp1hm
      double precision addp1hn
      double precision addp1ho
      double precision adfac
      double precision adphi
      double precision adphih
      double precision adphilc
      double precision adphimax
      double precision adphimaxh
      double precision adphimaxk
      double precision adphimd
      double precision adphimin
      double precision adphimink
      double precision adpsi
      double precision adqi
      double precision adqim
      double precision adqimm
      double precision adqimmm
      double precision adqip
      double precision adqipp
      double precision adrecip_deli
      double precision adrecip_delii
      double precision adrecip_delip
      double precision adrecip_delipi
      double precision adrp1h
      double precision adrp1h_cfl
      double precision advloc
      double precision b
      double precision c
      double precision cfl
      double precision d
      double precision d2
      double precision d2m1
      double precision d2p1
      double precision del2
      double precision del2m
      double precision del2mm
      double precision del2p
      double precision del2pp
      double precision del3m
      double precision del3mm
      double precision del3p
      double precision del3pp
      double precision del4
      double precision del4m
      double precision del4p
      double precision del5m
      double precision del5p
      double precision del6
      double precision deli
      double precision delip
      double precision delm
      double precision delmm
      double precision delmmm
      double precision delp
      double precision delpp
      double precision dm1h
      double precision dm1hi
      double precision dm1hj
      double precision dm1hm
      double precision dm1hn
      double precision dp1h
      double precision dp1hi
      double precision dp1hj
      double precision dp1hm
      double precision dp1hn
      double precision eps
      double precision fac
      integer i
      integer j
      double precision mski
      double precision mskim
      double precision mskimm
      double precision mskimmm
      double precision mskip
      double precision phi
      double precision phih
      double precision philc
      double precision phimax
      double precision phimaxh
      double precision phimaxi
      double precision phimaxj
      double precision phimaxk
      double precision phimd
      double precision phimin
      double precision phiminh
      double precision phimini
      double precision phiminj
      double precision phimink
      double precision psi
      double precision qi
      double precision qim
      double precision qimm
      double precision qimmm
      double precision qip
      double precision qipp
      double precision recip_deli
      double precision recip_delih
      double precision recip_delii
      double precision recip_delip
      double precision recip_deliph
      double precision recip_delipi
      double precision rp1h
      double precision rp1h_cfl
      double precision vloc

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      ada = 0.d0
      adb = 0.d0
      adc = 0.d0
      adcfl = 0.d0
      add = 0.d0
      add2 = 0.d0
      add2m1 = 0.d0
      add2p1 = 0.d0
      addel2 = 0.d0
      addel2m = 0.d0
      addel2mm = 0.d0
      addel2p = 0.d0
      addel2pp = 0.d0
      addel3m = 0.d0
      addel3mm = 0.d0
      addel3p = 0.d0
      addel3pp = 0.d0
      addel4 = 0.d0
      addel4m = 0.d0
      addel4p = 0.d0
      addel5m = 0.d0
      addel5p = 0.d0
      addel6 = 0.d0
      addeli = 0.d0
      addelip = 0.d0
      addelm = 0.d0
      addelmm = 0.d0
      addelmmm = 0.d0
      addelp = 0.d0
      addelpp = 0.d0
      addm1h = 0.d0
      addp1h = 0.d0
      adfac = 0.d0
      adphi = 0.d0
      adphilc = 0.d0
      adphimax = 0.d0
      adphimd = 0.d0
      adphimin = 0.d0
      adpsi = 0.d0
      adqi = 0.d0
      adqim = 0.d0
      adqimm = 0.d0
      adqimmm = 0.d0
      adqip = 0.d0
      adqipp = 0.d0
      adrecip_deli = 0.d0
      adrecip_delip = 0.d0
      adrp1h = 0.d0
      adrp1h_cfl = 0.d0
      advloc = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      eps = 9.9999999999999d-21
      do j = sny+oly-3, 1-oly+4, -1
        do i = snx+olx, 1-olx, -1
          vloc = vfld(i,j)
          cfl = vloc
          if (calccfl) then
            cfl = abs(vloc*deltatloc*recip_dyc(i,j,bi,bj))
          endif
          if (vtrans(i,j) .gt. 0.d0) then
            qipp = q(i,j+1)
            qip = q(i,j)
            qi = q(i,j-1)
            qim = q(i,j-2)
            qimm = q(i,j-3)
            qimmm = q(i,j-4)
            mskip = masklocs(i,j+1)
            mski = masklocs(i,j)
            mskim = masklocs(i,j-1)
            mskimm = masklocs(i,j-2)
            mskimmm = masklocs(i,j-3)
          else if (vtrans(i,j) .lt. 0.d0) then
            qipp = q(i,j-2)
            qip = q(i,j-1)
            qi = q(i,j)
            qim = q(i,j+1)
            qimm = q(i,j+2)
            qimmm = q(i,j+3)
            mskip = masklocs(i,j-1)
            mski = masklocs(i,j)
            mskim = masklocs(i,j+1)
            mskimm = masklocs(i,j+2)
            mskimmm = masklocs(i,j+3)
          else
            qipp = 0.d0
            qip = 0.d0
            qi = 0.d0
            qim = 0.d0
            qimm = 0.d0
            qimmm = 0.d0
            mskip = 0.d0
            mski = 0.d0
            mskim = 0.d0
            mskimm = 0.d0
            mskimmm = 0.d0
          endif
          if (vtrans(i,j) .ne. 0.d0) then
            fac = 1.d0
            delp = (qip-qi)*mski
            phi = fac*delp
            fac = fac*(cfl+1.d0)/3.d0
            delm = (qi-qim)*mskim
            del2 = delp-delm
            phi = phi-fac*del2
            fac = fac*(cfl-2.d0)/4.d0
            delpp = (qipp-qip)*mskip*mski
            del2p = delpp-delp
            del3p = del2p-del2
            phi = phi+fac*del3p
            fac = fac*(cfl-3.d0)/5.d0
            delmm = (qim-qimm)*mskimm*mskim
            del2m = delm-delmm
            del3m = del2-del2m
            del4 = del3p-del3m
            phi = phi+fac*del4
            fac = fac*(cfl+2.d0)/6.d0
            del2pp = delpp-delp
            del3pp = del2pp-del2p
            del4p = del3pp-del3p
            del5p = del4p-del4
            phi = phi+fac*del5p
            fac = fac*(cfl+2.d0)/7.d0
            delmmm = (qimm-qimmm)*mskimmm*mskimm*mskim
            del2mm = delmm-delmmm
            del3mm = del2m-del2mm
            del4m = del3m-del3mm
            del5m = del4-del4m
            del6 = del5p-del5m
            phi = phi-fac*del6
            delip = (qip-qi)*mski
            recip_delip = sign(1.d0,delip)/max(abs(delip),eps)
            phi = phi*recip_delip
            deli = (qi-qim)*mskim
            recip_deli = sign(1.d0,deli)/max(abs(deli),eps)
            rp1h = deli*recip_delip
            rp1h_cfl = rp1h/(cfl+eps)
            d2 = del2
            d2p1 = del2p
            d2m1 = del2m
            a = 4.d0*d2-d2p1
            b = 4.d0*d2p1-d2
            c = d2
            d = d2p1
            dp1h = max(min(a,b,c,d),0.d0)+min(max(a,b,c,d),0.d0)
            a = 4.d0*d2m1-d2
            b = 4.d0*d2-d2m1
            c = d2m1
            d = d2
            dm1h = max(min(a,b,c,d),0.d0)+min(max(a,b,c,d),0.d0)
            phimd = 1.d0/(1.d0-cfl)*(delip-dp1h)*recip_delip
            philc = rp1h_cfl*(1.d0+dm1h*recip_deli)
            phimin = max(min(0.d0,phimd),min(0.d0,2.d0*rp1h_cfl,philc))
            phimax = min(max(2.d0/(1.d0-cfl),phimd),max(0.d0,2.d0*
     $rp1h_cfl,philc))
            phi = max(phimin,min(phi,phimax))
            psi = phi*0.5d0*(1.d0-cfl)
            addelip = addelip+advt(i,j)*vtrans(i,j)*psi
            adpsi = adpsi+advt(i,j)*vtrans(i,j)*delip
            adqi = adqi+advt(i,j)*vtrans(i,j)
            advtrans(i,j) = advtrans(i,j)+advt(i,j)*(qi+psi*delip)
            advt(i,j) = 0.d0
            adcfl = adcfl-0.5d0*adpsi*phi
            adphi = adphi+0.5d0*adpsi*(1.d0-cfl)
            adpsi = 0.d0
            fac = 1.d0
            phi = fac*delp
            fac = fac*(cfl+1.d0)/3.d0
            phi = phi-fac*del2
            fac = fac*(cfl-2.d0)/4.d0
            phi = phi+fac*del3p
            fac = fac*(cfl-3.d0)/5.d0
            phi = phi+fac*del4
            fac = fac*(cfl+2.d0)/6.d0
            phi = phi+fac*del5p
            fac = fac*(cfl+2.d0)/7.d0
            phi = phi-fac*del6
            phi = phi*recip_delip
            phih = min(phi,phimax)
            adphih = adphi*(0.5-sign(0.5d0,phimin-phih))
            adphimin = adphimin+adphi*(0.5+sign(0.5d0,phimin-phih))
            adphi = adphih*(0.5+sign(0.5d0,phimax-phi))
            adphimax = adphimax+adphih*(0.5-sign(0.5d0,phimax-phi))
            phimaxh = max(2.d0/(1.d0-cfl),phimd)
            phimaxi = 2.d0*rp1h_cfl
            phimaxj = max(0.d0,phimaxi)
            phimaxk = max(phimaxj,philc)
            adphimaxh = adphimax*(0.5+sign(0.5d0,phimaxk-phimaxh))
            adphimaxk = adphimax*(0.5-sign(0.5d0,phimaxk-phimaxh))
            adphilc = adphilc+adphimaxk*(0.5-sign(0.5d0,phimaxj-philc))
            adrp1h_cfl = adrp1h_cfl+2*adphimaxk*(0.5+sign(0.5d0,phimaxj-
     $philc))*(0.5-sign(0.5d0,0.d0-phimaxi))
            adcfl = adcfl-adphimaxh*(0.5+sign(0.5d0,2.d0/(1.d0-cfl)-
     $phimd))*((-2)/((1.d0-cfl)*(1.d0-cfl)))
            adphimd = adphimd+adphimaxh*(0.5-sign(0.5d0,2.d0/(1.d0-cfl)-
     $phimd))
            adphimax = 0.d0
            phiminh = min(0.d0,phimd)
            phimini = 2.d0*rp1h_cfl
            phiminj = min(0.d0,phimini)
            phimink = min(phiminj,philc)
            adphimink = adphimin*(0.5-sign(0.5d0,phiminh-phimink))
            adphilc = adphilc+adphimink*(0.5-sign(0.5d0,philc-phiminj))
            adrp1h_cfl = adrp1h_cfl+2*adphimink*(0.5+sign(0.5d0,philc-
     $phiminj))*(0.5-sign(0.5d0,phimini-0.d0))
            adphimd = adphimd+adphimin*(0.5+sign(0.5d0,phiminh-phimink))
     $*(0.5-sign(0.5d0,phimd-0.d0))
            adphimin = 0.d0
            addm1h = addm1h+adphilc*rp1h_cfl*recip_deli
            adrecip_deli = adrecip_deli+adphilc*rp1h_cfl*dm1h
            adrp1h_cfl = adrp1h_cfl+adphilc*(1+dm1h*recip_deli)
            adphilc = 0.d0
            adcfl = adcfl-(-(adphimd/((1.d0-cfl)*(1.d0-cfl))))*(delip-
     $dp1h)*recip_delip
            addelip = addelip+adphimd*1.d0/(1.d0-cfl)*recip_delip
            addp1h = addp1h-adphimd*1.d0/(1.d0-cfl)*recip_delip
            adrecip_delip = adrecip_delip+adphimd*1.d0/(1.d0-cfl)*(
     $delip-dp1h)
            adphimd = 0.d0
            dm1hi = max(a,b)
            dm1hj = max(dm1hi,c)
            dm1hm = min(a,b)
            dm1hn = min(dm1hm,c)
            addm1ho = addm1h*(0.5+sign(0.5d0,min(dm1hn,d)-0.d0))
            add = add+addm1ho*(0.5-sign(0.5d0,d-dm1hn))
            addm1hn = addm1ho*(0.5+sign(0.5d0,d-dm1hn))
            adc = adc+addm1hn*(0.5-sign(0.5d0,c-dm1hm))
            addm1hm = addm1hn*(0.5+sign(0.5d0,c-dm1hm))
            ada = ada+addm1hm*(0.5+sign(0.5d0,b-a))
            adb = adb+addm1hm*(0.5-sign(0.5d0,b-a))
            addm1hk = addm1h*(0.5+sign(0.5d0,0.d0-max(dm1hj,d)))
            add = add+addm1hk*(0.5-sign(0.5d0,dm1hj-d))
            addm1hj = addm1hk*(0.5+sign(0.5d0,dm1hj-d))
            adc = adc+addm1hj*(0.5-sign(0.5d0,dm1hi-c))
            addm1hi = addm1hj*(0.5+sign(0.5d0,dm1hi-c))
            ada = ada+addm1hi*(0.5+sign(0.5d0,a-b))
            adb = adb+addm1hi*(0.5-sign(0.5d0,a-b))
            addm1h = 0.d0
            add2 = add2+add
            add = 0.d0
            add2m1 = add2m1+adc
            adc = 0.d0
            add2 = add2+4*adb
            add2m1 = add2m1-adb
            adb = 0.d0
            add2 = add2-ada
            add2m1 = add2m1+4*ada
            ada = 0.d0
            a = 4.d0*d2-d2p1
            b = 4.d0*d2p1-d2
            c = d2
            d = d2p1
            dp1hi = max(a,b)
            dp1hj = max(dp1hi,c)
            dp1hm = min(a,b)
            dp1hn = min(dp1hm,c)
            addp1ho = addp1h*(0.5+sign(0.5d0,min(dp1hn,d)-0.d0))
            add = add+addp1ho*(0.5-sign(0.5d0,d-dp1hn))
            addp1hn = addp1ho*(0.5+sign(0.5d0,d-dp1hn))
            adc = adc+addp1hn*(0.5-sign(0.5d0,c-dp1hm))
            addp1hm = addp1hn*(0.5+sign(0.5d0,c-dp1hm))
            ada = ada+addp1hm*(0.5+sign(0.5d0,b-a))
            adb = adb+addp1hm*(0.5-sign(0.5d0,b-a))
            addp1hk = addp1h*(0.5+sign(0.5d0,0.d0-max(dp1hj,d)))
            add = add+addp1hk*(0.5-sign(0.5d0,dp1hj-d))
            addp1hj = addp1hk*(0.5+sign(0.5d0,dp1hj-d))
            adc = adc+addp1hj*(0.5-sign(0.5d0,dp1hi-c))
            addp1hi = addp1hj*(0.5+sign(0.5d0,dp1hi-c))
            ada = ada+addp1hi*(0.5+sign(0.5d0,a-b))
            adb = adb+addp1hi*(0.5-sign(0.5d0,a-b))
            addp1h = 0.d0
            add2p1 = add2p1+add
            add = 0.d0
            add2 = add2+adc
            adc = 0.d0
            add2 = add2-adb
            add2p1 = add2p1+4*adb
            adb = 0.d0
            add2 = add2+4*ada
            add2p1 = add2p1-ada
            ada = 0.d0
            addel2m = addel2m+add2m1
            add2m1 = 0.d0
            addel2p = addel2p+add2p1
            add2p1 = 0.d0
            addel2 = addel2+add2
            add2 = 0.d0
            adcfl = adcfl-adrp1h_cfl*(rp1h/((cfl+eps)*(cfl+eps)))
            adrp1h = adrp1h+adrp1h_cfl/(cfl+eps)
            adrp1h_cfl = 0.d0
            addeli = addeli+adrp1h*recip_delip
            adrecip_delip = adrecip_delip+adrp1h*deli
            adrp1h = 0.d0
            recip_delii = abs(deli)
            recip_delih = max(recip_delii,eps)
            adrecip_delii = -(adrecip_deli*sign(1.d0,deli)/(recip_delih*
     $recip_delih)*(0.5+sign(0.5d0,recip_delii-eps)))
            addeli = addeli+adrecip_delii*sign(1.d0,deli)
            adrecip_deli = 0.d0
            adqi = adqi+addeli*mskim
            adqim = adqim-addeli*mskim
            addeli = 0.d0
            fac = 1.d0
            phi = fac*delp
            fac = fac*(cfl+1.d0)/3.d0
            phi = phi-fac*del2
            fac = fac*(cfl-2.d0)/4.d0
            phi = phi+fac*del3p
            fac = fac*(cfl-3.d0)/5.d0
            phi = phi+fac*del4
            fac = fac*(cfl+2.d0)/6.d0
            phi = phi+fac*del5p
            fac = fac*(cfl+2.d0)/7.d0
            phi = phi-fac*del6
            adrecip_delip = adrecip_delip+adphi*phi
            adphi = adphi*recip_delip
            recip_delipi = abs(delip)
            recip_deliph = max(recip_delipi,eps)
            adrecip_delipi = -(adrecip_delip*sign(1.d0,delip)/(
     $recip_deliph*recip_deliph)*(0.5+sign(0.5d0,recip_delipi-eps)))
            addelip = addelip+adrecip_delipi*sign(1.d0,delip)
            adrecip_delip = 0.d0
            adqi = adqi-addelip*mski
            adqip = adqip+addelip*mski
            addelip = 0.d0
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            fac = fac*(cfl-3.d0)/5.d0
            fac = fac*(cfl+2.d0)/6.d0
            fac = fac*(cfl+2.d0)/7.d0
            addel6 = addel6-adphi*fac
            adfac = adfac-adphi*del6
            addel5m = addel5m-addel6
            addel5p = addel5p+addel6
            addel6 = 0.d0
            addel4 = addel4+addel5m
            addel4m = addel4m-addel5m
            addel5m = 0.d0
            addel3m = addel3m+addel4m
            addel3mm = addel3mm-addel4m
            addel4m = 0.d0
            addel2m = addel2m+addel3mm
            addel2mm = addel2mm-addel3mm
            addel3mm = 0.d0
            addelmm = addelmm+addel2mm
            addelmmm = addelmmm-addel2mm
            addel2mm = 0.d0
            adqimm = adqimm+addelmmm*mskimmm*mskimm*mskim
            adqimmm = adqimmm-addelmmm*mskimmm*mskimm*mskim
            addelmmm = 0.d0
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            fac = fac*(cfl-3.d0)/5.d0
            fac = fac*(cfl+2.d0)/6.d0
            adcfl = adcfl+adfac*(fac/7.d0)
            adfac = adfac*((2+cfl)/7.d0)
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            fac = fac*(cfl-3.d0)/5.d0
            fac = fac*(cfl+2.d0)/6.d0
            addel5p = addel5p+adphi*fac
            adfac = adfac+adphi*del5p
            addel4 = addel4-addel5p
            addel4p = addel4p+addel5p
            addel5p = 0.d0
            addel3p = addel3p-addel4p
            addel3pp = addel3pp+addel4p
            addel4p = 0.d0
            addel2p = addel2p-addel3pp
            addel2pp = addel2pp+addel3pp
            addel3pp = 0.d0
            addelp = addelp-addel2pp
            addelpp = addelpp+addel2pp
            addel2pp = 0.d0
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            fac = fac*(cfl-3.d0)/5.d0
            adcfl = adcfl+adfac*(fac/6.d0)
            adfac = adfac*((2+cfl)/6.d0)
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            fac = fac*(cfl-3.d0)/5.d0
            addel4 = addel4+adphi*fac
            adfac = adfac+adphi*del4
            addel3m = addel3m-addel4
            addel3p = addel3p+addel4
            addel4 = 0.d0
            addel2 = addel2+addel3m
            addel2m = addel2m-addel3m
            addel3m = 0.d0
            addelm = addelm+addel2m
            addelmm = addelmm-addel2m
            addel2m = 0.d0
            adqim = adqim+addelmm*mskimm*mskim
            adqimm = adqimm-addelmm*mskimm*mskim
            addelmm = 0.d0
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            adcfl = adcfl+adfac*(fac/5.d0)
            adfac = adfac*(((-3)+cfl)/5.d0)
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            fac = fac*(cfl-2.d0)/4.d0
            addel3p = addel3p+adphi*fac
            adfac = adfac+adphi*del3p
            addel2 = addel2-addel3p
            addel2p = addel2p+addel3p
            addel3p = 0.d0
            addelp = addelp-addel2p
            addelpp = addelpp+addel2p
            addel2p = 0.d0
            adqip = adqip-addelpp*mskip*mski
            adqipp = adqipp+addelpp*mskip*mski
            addelpp = 0.d0
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            adcfl = adcfl+adfac*(fac/4.d0)
            adfac = adfac*(((-2)+cfl)/4.d0)
            fac = 1.d0
            fac = fac*(cfl+1.d0)/3.d0
            addel2 = addel2-adphi*fac
            adfac = adfac-adphi*del2
            addelm = addelm-addel2
            addelp = addelp+addel2
            addel2 = 0.d0
            adqi = adqi+addelm*mskim
            adqim = adqim-addelm*mskim
            addelm = 0.d0
            fac = 1.d0
            adcfl = adcfl+adfac*(fac/3.d0)
            adfac = adfac*((1+cfl)/3.d0)
            fac = 1.d0
            addelp = addelp+adphi*fac
            adfac = adfac+adphi*delp
            adphi = 0.d0
            adqi = adqi-addelp*mski
            adqip = adqip+addelp*mski
            addelp = 0.d0
            adfac = 0.d0
          else
            advt(i,j) = 0.d0
          endif
          if (vtrans(i,j) .gt. 0.d0) then
            adq(i,j-4) = adq(i,j-4)+adqimmm
            adqimmm = 0.d0
            adq(i,j-3) = adq(i,j-3)+adqimm
            adqimm = 0.d0
            adq(i,j-2) = adq(i,j-2)+adqim
            adqim = 0.d0
            adq(i,j-1) = adq(i,j-1)+adqi
            adqi = 0.d0
            adq(i,j) = adq(i,j)+adqip
            adqip = 0.d0
            adq(i,j+1) = adq(i,j+1)+adqipp
            adqipp = 0.d0
          else if (vtrans(i,j) .lt. 0.d0) then
            adq(i,j+3) = adq(i,j+3)+adqimmm
            adqimmm = 0.d0
            adq(i,j+2) = adq(i,j+2)+adqimm
            adqimm = 0.d0
            adq(i,j+1) = adq(i,j+1)+adqim
            adqim = 0.d0
            adq(i,j) = adq(i,j)+adqi
            adqi = 0.d0
            adq(i,j-1) = adq(i,j-1)+adqip
            adqip = 0.d0
            adq(i,j-2) = adq(i,j-2)+adqipp
            adqipp = 0.d0
          else
            adqimmm = 0.d0
            adqimm = 0.d0
            adqim = 0.d0
            adqi = 0.d0
            adqip = 0.d0
            adqipp = 0.d0
          endif
          if (calccfl) then
            advloc = advloc+adcfl*deltatloc*recip_dyc(i,j,bi,bj)*sign(
     $1.d0,vloc*deltatloc*recip_dyc(i,j,bi,bj))
            adcfl = 0.d0
          endif
          advloc = advloc+adcfl
          adcfl = 0.d0
          advfld(i,j) = advfld(i,j)+advloc
          advloc = 0.d0
        end do
      end do
      do i = 1-olx, snx+olx
        advt(i,sny+oly) = 0.d0
        advt(i,sny+oly-1) = 0.d0
        advt(i,sny+oly-2) = 0.d0
        advt(i,4-oly) = 0.d0
        advt(i,3-oly) = 0.d0
        advt(i,2-oly) = 0.d0
        advt(i,1-oly) = 0.d0
      end do

      end

      subroutine adgad_u3_adv_r( bi, bj, k, rtrans, adrtrans, tracer, 
     $adtracer, adwt )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision onesixth
      parameter ( onesixth = 1.d0/6.d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adrtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwt(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)

C==============================================
C declare local variables
C==============================================
      double precision adrj
      double precision adrjjm
      double precision adrjjp
      double precision adrjm
      double precision adrjp
      double precision adwth
      integer i
      integer j
      integer km1
      integer km2
      integer kp1
      double precision rj
      double precision rjjm
      double precision rjjp
      double precision rjm
      double precision rjp
      double precision wth

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adrj = 0.d0
      adrjjm = 0.d0
      adrjjp = 0.d0
      adrjm = 0.d0
      adrjp = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      km2 = max(1,k-2)
      km1 = max(1,k-1)
      kp1 = min(nr,k+1)
      if (k .eq. 1 .or. k .gt. nr) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adwt(i,j) = 0.d0
          end do
        end do
      else
        do j = sny+oly, 1-oly, -1
          adrj = 0.d0
          adrjjm = 0.d0
          adrjjp = 0.d0
          adrjm = 0.d0
          adrjp = 0.d0
          do i = snx+olx, 1-olx, -1
            adrj = 0.d0
            adrjjm = 0.d0
            adrjjp = 0.d0
            adrjm = 0.d0
            adrjp = 0.d0
            rjp = (tracer(i,j,kp1,bi,bj)-tracer(i,j,k,bi,bj))*maskc(i,j,
     $kp1,bi,bj)
            rj = tracer(i,j,k,bi,bj)-tracer(i,j,km1,bi,bj)
            rjm = (tracer(i,j,km1,bi,bj)-tracer(i,j,km2,bi,bj))*maskc(i,
     $j,km2,bi,bj)
            rjjp = rjp-rj
            rjjm = rj-rjm
            wth = abs(rtrans(i,j))
            adrjjm = adrjjm+adwt(i,j)*maskc(i,j,km1,bi,bj)*((-(0.5d0*
     $rtrans(i,j)*onesixth))+0.5d0*wth*onesixth)
            adrjjp = adrjjp+adwt(i,j)*maskc(i,j,km1,bi,bj)*((-(0.5d0*
     $rtrans(i,j)*onesixth))-0.5d0*wth*onesixth)
            adrtrans(i,j) = adrtrans(i,j)+adwt(i,j)*maskc(i,j,km1,bi,bj)
     $*(0.5d0*(tracer(i,j,k,bi,bj)+tracer(i,j,km1,bi,bj))-0.5d0*
     $onesixth*(rjjm+rjjp))
            adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+0.5d0*adwt(i,
     $j)*maskc(i,j,km1,bi,bj)*rtrans(i,j)
            adtracer(i,j,km1,bi,bj) = adtracer(i,j,km1,bi,bj)+0.5d0*
     $adwt(i,j)*maskc(i,j,km1,bi,bj)*rtrans(i,j)
            adwth = 0.5d0*adwt(i,j)*maskc(i,j,km1,bi,bj)*onesixth*(rjjm-
     $rjjp)
            adrtrans(i,j) = adrtrans(i,j)+adwth*sign(1.d0,rtrans(i,j))
            adwt(i,j) = 0.d0
            adrj = adrj+adrjjm
            adrjm = adrjm-adrjjm
            adrjjm = 0.d0
            adrj = adrj-adrjjp
            adrjp = adrjp+adrjjp
            adrjjp = 0.d0
            adtracer(i,j,km1,bi,bj) = adtracer(i,j,km1,bi,bj)+adrjm*
     $maskc(i,j,km2,bi,bj)
            adtracer(i,j,km2,bi,bj) = adtracer(i,j,km2,bi,bj)-adrjm*
     $maskc(i,j,km2,bi,bj)
            adrjm = 0.d0
            adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+adrj
            adtracer(i,j,km1,bi,bj) = adtracer(i,j,km1,bi,bj)-adrj
            adrj = 0.d0
            adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)-adrjp*maskc(i,
     $j,kp1,bi,bj)
            adtracer(i,j,kp1,bi,bj) = adtracer(i,j,kp1,bi,bj)+adrjp*
     $maskc(i,j,kp1,bi,bj)
            adrjp = 0.d0
          end do
        end do
      endif

      end

      subroutine adgad_u3_adv_x( bi, bj, k, utrans, adutrans, tracer, 
     $adtracer, adut )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision onesixth
      parameter ( onesixth = 1.d0/6.d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision adut(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adrj
      double precision adrjjm
      double precision adrjjp
      double precision adrjm
      double precision adrjp
      double precision aduth
      integer i
      integer j
      double precision rj
      double precision rjjm
      double precision rjjp
      double precision rjm
      double precision rjp
      double precision uth

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adrj = 0.d0
      adrjjm = 0.d0
      adrjjp = 0.d0
      adrjm = 0.d0
      adrjp = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = sny+oly, 1-oly, -1
        adrj = 0.d0
        adrjjm = 0.d0
        adrjjp = 0.d0
        adrjm = 0.d0
        adrjp = 0.d0
        do i = snx+olx-1, 1-olx+2, -1
          adrj = 0.d0
          adrjjm = 0.d0
          adrjjp = 0.d0
          adrjm = 0.d0
          adrjp = 0.d0
          rjp = (tracer(i+1,j)-tracer(i,j))*maskw(i+1,j,k,bi,bj)
          rj = (tracer(i,j)-tracer(i-1,j))*maskw(i,j,k,bi,bj)
          rjm = (tracer(i-1,j)-tracer(i-2,j))*maskw(i-1,j,k,bi,bj)
          rjjp = rjp-rj
          rjjm = rj-rjm
          uth = abs(utrans(i,j))
          adrjjm = adrjjm+adut(i,j)*((-(0.5d0*utrans(i,j)*onesixth))-
     $0.5d0*uth*onesixth)
          adrjjp = adrjjp+adut(i,j)*((-(0.5d0*utrans(i,j)*onesixth))+
     $0.5d0*uth*onesixth)
          adtracer(i-1,j) = adtracer(i-1,j)+0.5d0*adut(i,j)*utrans(i,j)
          adtracer(i,j) = adtracer(i,j)+0.5d0*adut(i,j)*utrans(i,j)
          aduth = 0.5d0*adut(i,j)*onesixth*(rjjp-rjjm)
          adutrans(i,j) = adutrans(i,j)+0.5d0*adut(i,j)*(tracer(i,j)+
     $tracer(i-1,j)-onesixth*(rjjp+rjjm))
          adutrans(i,j) = adutrans(i,j)+aduth*sign(1.d0,utrans(i,j))
          adut(i,j) = 0.d0
          adrj = adrj+adrjjm
          adrjm = adrjm-adrjjm
          adrjjm = 0.d0
          adrj = adrj-adrjjp
          adrjp = adrjp+adrjjp
          adrjjp = 0.d0
          adtracer(i-2,j) = adtracer(i-2,j)-adrjm*maskw(i-1,j,k,bi,bj)
          adtracer(i-1,j) = adtracer(i-1,j)+adrjm*maskw(i-1,j,k,bi,bj)
          adrjm = 0.d0
          adtracer(i-1,j) = adtracer(i-1,j)-adrj*maskw(i,j,k,bi,bj)
          adtracer(i,j) = adtracer(i,j)+adrj*maskw(i,j,k,bi,bj)
          adrj = 0.d0
          adtracer(i+1,j) = adtracer(i+1,j)+adrjp*maskw(i+1,j,k,bi,bj)
          adtracer(i,j) = adtracer(i,j)-adrjp*maskw(i+1,j,k,bi,bj)
          adrjp = 0.d0
        end do
      end do

      end

      subroutine adgad_u3_adv_y( bi, bj, k, vtrans, advtrans, tracer, 
     $adtracer, advt )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision onesixth
      parameter ( onesixth = 1.d0/6.d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision advt(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adrj
      double precision adrjjm
      double precision adrjjp
      double precision adrjm
      double precision adrjp
      double precision advth
      integer i
      integer j
      double precision rj
      double precision rjjm
      double precision rjjp
      double precision rjm
      double precision rjp
      double precision vth

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adrj = 0.d0
      adrjjm = 0.d0
      adrjjp = 0.d0
      adrjm = 0.d0
      adrjp = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = sny+oly-1, 1-oly+2, -1
        adrj = 0.d0
        adrjjm = 0.d0
        adrjjp = 0.d0
        adrjm = 0.d0
        adrjp = 0.d0
        do i = snx+olx, 1-olx, -1
          adrj = 0.d0
          adrjjm = 0.d0
          adrjjp = 0.d0
          adrjm = 0.d0
          adrjp = 0.d0
          rjp = (tracer(i,j+1)-tracer(i,j))*masks(i,j+1,k,bi,bj)
          rj = (tracer(i,j)-tracer(i,j-1))*masks(i,j,k,bi,bj)
          rjm = (tracer(i,j-1)-tracer(i,j-2))*masks(i,j-1,k,bi,bj)
          rjjp = rjp-rj
          rjjm = rj-rjm
          vth = abs(vtrans(i,j))
          adrjjm = adrjjm+advt(i,j)*((-(0.5d0*vtrans(i,j)*onesixth))-
     $0.5d0*vth*onesixth)
          adrjjp = adrjjp+advt(i,j)*((-(0.5d0*vtrans(i,j)*onesixth))+
     $0.5d0*vth*onesixth)
          adtracer(i,j-1) = adtracer(i,j-1)+0.5d0*advt(i,j)*vtrans(i,j)
          adtracer(i,j) = adtracer(i,j)+0.5d0*advt(i,j)*vtrans(i,j)
          advth = 0.5d0*advt(i,j)*onesixth*(rjjp-rjjm)
          advtrans(i,j) = advtrans(i,j)+0.5d0*advt(i,j)*(tracer(i,j)+
     $tracer(i,j-1)-onesixth*(rjjp+rjjm))
          advtrans(i,j) = advtrans(i,j)+advth*sign(1.d0,vtrans(i,j))
          advt(i,j) = 0.d0
          adrj = adrj+adrjjm
          adrjm = adrjm-adrjjm
          adrjjm = 0.d0
          adrj = adrj-adrjjp
          adrjp = adrjp+adrjjp
          adrjjp = 0.d0
          adtracer(i,j-2) = adtracer(i,j-2)-adrjm*masks(i,j-1,k,bi,bj)
          adtracer(i,j-1) = adtracer(i,j-1)+adrjm*masks(i,j-1,k,bi,bj)
          adrjm = 0.d0
          adtracer(i,j-1) = adtracer(i,j-1)-adrj*masks(i,j,k,bi,bj)
          adtracer(i,j) = adtracer(i,j)+adrj*masks(i,j,k,bi,bj)
          adrj = 0.d0
          adtracer(i,j+1) = adtracer(i,j+1)+adrjp*masks(i,j+1,k,bi,bj)
          adtracer(i,j) = adtracer(i,j)-adrjp*masks(i,j+1,k,bi,bj)
          adrjp = 0.d0
        end do
      end do
      do i = 1-olx, snx+olx
        advt(i,sny+oly) = 0.d0
        advt(i,2-oly) = 0.d0
        advt(i,1-oly) = 0.d0
      end do

      end

      subroutine adgmredi_calc_diff( bi, bj, imin, imax, jmin, jmax, 
     $karg, ksize, adkapparx, traceridentity )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer gad_tr1
      parameter ( gad_tr1 = 3 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adkwx(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adkwy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adkwz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /adgm_wtensor/ adkwx, adkwy, adkwz

C==============================================
C declare arguments
C==============================================
      integer ksize
      double precision adkapparx(1-olx:snx+olx,1-oly:sny+oly,ksize)
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer karg
      integer traceridentity

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      integer k

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (karg .eq. 0) then
        do k = 1, min(nr,ksize)
          do j = jmin, jmax
            do i = imin, imax
              if (traceridentity .lt. gad_tr1) then
                adkwz(i,j,k,bi,bj) = adkwz(i,j,k,bi,bj)+adkapparx(i,j,k)
              else
                adkwz(i,j,k,bi,bj) = adkwz(i,j,k,bi,bj)+adkapparx(i,j,k)
              endif
            end do
          end do
        end do
      else
        k = min(karg,ksize)
        do j = jmin, jmax
          do i = imin, imax
            if (traceridentity .lt. gad_tr1) then
              adkwz(i,j,karg,bi,bj) = adkwz(i,j,karg,bi,bj)+adkapparx(i,
     $j,k)
            else
              adkwz(i,j,karg,bi,bj) = adkwz(i,j,karg,bi,bj)+adkapparx(i,
     $j,k)
            endif
          end do
        end do
      endif

      end

      subroutine adgmredi_calc_tensor( adsigmax, adsigmay, adsigmar, bi,
     $ bj, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision op25
      parameter ( op25 = 0.25d0 )
      double precision op5
      parameter ( op5 = 0.5d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adkux(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adkvy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /adgm_hortensor/ adkux, adkvy

      double precision adkuz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adkvz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /adgm_uvtensor/ adkuz, adkvz

      double precision adkwx(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adkwy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adkwz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /adgm_wtensor/ adkwx, adkwy, adkwz

      real*8 comlev1_bibj_k_dsigmadx_16h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmad0/ comlev1_bibj_k_dsigmadx_16h

      real*8 comlev1_bibj_k_dsigmady_2h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmad1/ comlev1_bibj_k_dsigmady_2h

      real*8 comlev1_bibj_k_dsigmadx_1h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmad2/ comlev1_bibj_k_dsigmadx_1h

      real*8 comlev1_bibj_k_dsigmadr_30h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmadr/ comlev1_bibj_k_dsigmadr_30h

      real*8 comlev1_bibj_k_dsigmadr_18h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmads/ comlev1_bibj_k_dsigmadr_18h

      real*8 comlev1_bibj_k_dsigmadr_3h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmadt/ comlev1_bibj_k_dsigmadr_3h

      real*8 comlev1_bibj_k_dsigmadx_28h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmadx/ comlev1_bibj_k_dsigmadx_28h

      real*8 comlev1_bibj_k_dsigmady_29h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmady/ comlev1_bibj_k_dsigmady_29h

      real*8 comlev1_bibj_k_dsigmady_17h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmadz/ comlev1_bibj_k_dsigmady_17h

      real*8 comlev1_bibj_k_kux_25h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadkuy/ comlev1_bibj_k_kux_25h

      real*8 comlev1_bibj_k_kvy_35h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadkv0/ comlev1_bibj_k_kvy_35h

      real*8 comlev1_bibj_k_slopex_7h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadslope0/ comlev1_bibj_k_slopex_7h

      real*8 comlev1_bibj_k_slopesqr_9h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadslopesqr/ comlev1_bibj_k_slopesqr_9h

      real*8 comlev1_bibj_k_slopex_26h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadslopex/ comlev1_bibj_k_slopex_26h

      real*8 comlev1_bibj_k_slopey_36h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadslopey/ comlev1_bibj_k_slopey_36h

      real*8 comlev1_bibj_k_slopey_8h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadslopez/ comlev1_bibj_k_slopey_8h

      real*8 comlev1_bibj_k_taperfct_37h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadtaperfct/ comlev1_bibj_k_taperfct_37h

      real*8 comlev1_bibj_k_taperfct_27h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadtaperfcu/ comlev1_bibj_k_taperfct_27h

      real*8 comlev1_bibj_k_taperfct_11h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadtaperfcv/ comlev1_bibj_k_taperfct_11h

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision gm_advect
      double precision gm_rmaxslope
      double precision gm_skewflx
      common /gm_derived_par/ gm_rmaxslope, gm_skewflx, gm_advect

      double precision kux(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kvy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /gm_hortensor/ kux, kvy

      character*(40) gm_taper_scheme
      common /gm_params_c/ gm_taper_scheme

      logical gm_advform
      logical gm_advseparate
      logical gm_extradiag
      logical gm_inmomasstress
      logical gm_mdsio
      logical gm_mnc
      common /gm_params_l/ gm_advform, gm_advseparate, gm_extradiag, 
     $gm_mnc, gm_mdsio, gm_inmomasstress

      double precision gm_background_k
      double precision gm_factrl2dz
      double precision gm_factrl2ml
      double precision gm_isopyck
      double precision gm_kmin_horiz
      double precision gm_maxslope
      double precision gm_maxtranslay
      double precision gm_scrit
      double precision gm_sd
      double precision gm_slopesqcutoff
      double precision gm_small_number
      double precision gm_visbeck_alpha
      double precision gm_visbeck_depth
      double precision gm_visbeck_length
      double precision gm_visbeck_maxslope
      double precision gm_visbeck_maxval_k
      double precision gm_visbeck_mindepth
      double precision gm_visbeck_minval_k
      common /gm_params_r/ gm_isopyck, gm_background_k, gm_maxslope, 
     $gm_kmin_horiz, gm_small_number, gm_slopesqcutoff, 
     $gm_visbeck_alpha, gm_visbeck_length, gm_visbeck_depth, 
     $gm_visbeck_mindepth, gm_visbeck_maxslope, gm_visbeck_minval_k, 
     $gm_visbeck_maxval_k, gm_factrl2dz, gm_factrl2ml, gm_maxtranslay, 
     $gm_scrit, gm_sd

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      double precision adsigmar(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adsigmax(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adsigmay(1-olx:snx+olx,1-oly:sny+oly,nr)
      integer bi
      integer bj
      integer mythid

C==============================================
C declare local variables
C==============================================
      integer act1
      integer act2
      integer act3
      integer act4
      double precision addsigmadr(1-olx:snx+olx,1-oly:sny+oly)
      double precision addsigmadx(1-olx:snx+olx,1-oly:sny+oly)
      double precision addsigmady(1-olx:snx+olx,1-oly:sny+oly)
      double precision adslopesqr(1-olx:snx+olx,1-oly:sny+oly)
      double precision adslopex(1-olx:snx+olx,1-oly:sny+oly)
      double precision adslopey(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtaperfct(1-olx:snx+olx,1-oly:sny+oly)
      double precision cspd
      double precision dsigmadr(1-olx:snx+olx,1-oly:sny+oly)
      double precision dsigmadx(1-olx:snx+olx,1-oly:sny+oly)
      double precision dsigmady(1-olx:snx+olx,1-oly:sny+oly)
      double precision fcoriloc
      integer i
      integer igmkey
      integer ip1
      integer ip2
      integer j
      integer k
      double precision kgm_tmp
      integer kkey
      integer kp1
      double precision ldd97_lrhoc(1-olx:snx+olx,1-oly:sny+oly)
      double precision ldd97_lrhos(1-olx:snx+olx,1-oly:sny+oly)
      double precision ldd97_lrhow(1-olx:snx+olx,1-oly:sny+oly)
      double precision lrhoinf
      double precision lrhosup
      double precision maskp1
      integer max1
      integer max2
      integer max3
      double precision slopesqr(1-olx:snx+olx,1-oly:sny+oly)
      double precision slopex(1-olx:snx+olx,1-oly:sny+oly)
      double precision slopey(1-olx:snx+olx,1-oly:sny+oly)
      double precision taperfct(1-olx:snx+olx,1-oly:sny+oly)

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          addsigmadr(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          addsigmadx(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          addsigmady(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adslopesqr(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adslopex(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adslopey(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adtaperfct(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      act1 = bi-mybxlo(mythid)
      max1 = mybxhi(mythid)-mybxlo(mythid)+1
      act2 = bj-mybylo(mythid)
      max2 = mybyhi(mythid)-mybylo(mythid)+1
      act3 = mythid-1
      max3 = ntx*nty
      act4 = ikey_dynamics-1
      igmkey = act1+1+act2*max1+act3*max1*max2+act4*max1*max2*max3
      if (gm_taper_scheme .eq. 'ldd97' .or. gm_taper_scheme .eq. 'fm07')
     $ then
        cspd = 2.d0
        lrhoinf = 15000.d0
        lrhosup = 1.d+5
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            if (fcori(i,j,bi,bj) .ne. 0.) then
              ldd97_lrhoc(i,j) = cspd/abs(fcori(i,j,bi,bj))
            else
              ldd97_lrhoc(i,j) = lrhosup
            endif
            ldd97_lrhoc(i,j) = max(lrhoinf,min(ldd97_lrhoc(i,j),lrhosup)
     $)
          end do
        end do
        do j = 1-oly, sny+oly
          ldd97_lrhow(1-olx,j) = lrhosup
          do i = 1-olx+1, snx+olx
            fcoriloc = op5*(fcori(i-1,j,bi,bj)+fcori(i,j,bi,bj))
            if (fcoriloc .ne. 0.) then
              ldd97_lrhow(i,j) = cspd/abs(fcoriloc)
            else
              ldd97_lrhow(i,j) = lrhosup
            endif
            ldd97_lrhow(i,j) = max(lrhoinf,min(ldd97_lrhow(i,j),lrhosup)
     $)
          end do
        end do
        do i = 1-olx+1, snx+olx
          ldd97_lrhos(i,1-oly) = lrhosup
        end do
        do j = 1-oly+1, sny+oly
          do i = 1-olx, snx+olx
            fcoriloc = op5*(fcori(i,j-1,bi,bj)+fcori(i,j,bi,bj))
            if (fcoriloc .ne. 0.) then
              ldd97_lrhos(i,j) = cspd/abs(fcoriloc)
            else
              ldd97_lrhos(i,j) = lrhosup
            endif
            ldd97_lrhos(i,j) = max(lrhoinf,min(ldd97_lrhos(i,j),lrhosup)
     $)
          end do
        end do
      else
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            ldd97_lrhoc(i,j) = 0.d0
            ldd97_lrhow(i,j) = 0.d0
            ldd97_lrhos(i,j) = 0.d0
          end do
        end do
      endif
      do k = 1, nr
        kp1 = min(nr,k+1)
        maskp1 = 1.d0
        if (k .ge. nr) then
          maskp1 = 0.d0
        endif
        kkey = (igmkey-1)*nr+k
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            dsigmadx(ip1,ip2) = comlev1_bibj_k_dsigmadx_28h(ip1,ip2,
     $kkey)
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            dsigmady(ip1,ip2) = comlev1_bibj_k_dsigmady_29h(ip1,ip2,
     $kkey)
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            dsigmadr(ip1,ip2) = comlev1_bibj_k_dsigmadr_30h(ip1,ip2,
     $kkey)
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            kvy(ip1,ip2,k,bi,bj) = comlev1_bibj_k_kvy_35h(ip1,ip2,kkey)
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            slopey(ip1,ip2) = comlev1_bibj_k_slopey_36h(ip1,ip2,kkey)
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            taperfct(ip1,ip2) = comlev1_bibj_k_taperfct_37h(ip1,ip2,
     $kkey)
          end do
        end do
        if (gm_extradiag) then
          do j = 1-oly+1, sny+oly-1
            do i = 1-olx+1, snx+olx-1
              adslopey(i,j) = adslopey(i,j)+adkvz(i,j,k,bi,bj)*(
     $gm_isopyck-gm_skewflx*gm_background_k)*taperfct(i,j)
              adtaperfct(i,j) = adtaperfct(i,j)+adkvz(i,j,k,bi,bj)*(
     $gm_isopyck-gm_skewflx*gm_background_k)*slopey(i,j)
              adkvz(i,j,k,bi,bj) = 0.d0
            end do
          end do
        endif
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            adkvy(i,j,k,bi,bj) = adkvy(i,j,k,bi,bj)*(0.5+sign(0.5d0,kvy(
     $i,j,k,bi,bj)-gm_kmin_horiz))
          end do
        end do
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            adtaperfct(i,j) = adtaperfct(i,j)+adkvy(i,j,k,bi,bj)*
     $gm_isopyck
            adkvy(i,j,k,bi,bj) = 0.d0
          end do
        end do
        call adgmredi_slope_limit( adslopex,adslopey,adslopesqr,
     $adtaperfct,dsigmadr,addsigmadr,dsigmadx,addsigmadx,dsigmady,
     $addsigmady,ldd97_lrhos,rc,k )
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            adsigmar(i,j-1,k) = adsigmar(i,j-1,k)+addsigmadr(i,j)*op25*
     $masks(i,j,k,bi,bj)
            adsigmar(i,j-1,kp1) = adsigmar(i,j-1,kp1)+addsigmadr(i,j)*
     $op25*maskp1*masks(i,j,k,bi,bj)
            adsigmar(i,j,k) = adsigmar(i,j,k)+addsigmadr(i,j)*op25*
     $masks(i,j,k,bi,bj)
            adsigmar(i,j,kp1) = adsigmar(i,j,kp1)+addsigmadr(i,j)*op25*
     $maskp1*masks(i,j,k,bi,bj)
            addsigmadr(i,j) = 0.d0
            adsigmay(i,j,k) = adsigmay(i,j,k)+addsigmady(i,j)*masks(i,j,
     $k,bi,bj)
            addsigmady(i,j) = 0.d0
            adsigmax(i+1,j-1,k) = adsigmax(i+1,j-1,k)+addsigmadx(i,j)*
     $op25*masks(i,j,k,bi,bj)
            adsigmax(i,j-1,k) = adsigmax(i,j-1,k)+addsigmadx(i,j)*op25*
     $masks(i,j,k,bi,bj)
            adsigmax(i+1,j,k) = adsigmax(i+1,j,k)+addsigmadx(i,j)*op25*
     $masks(i,j,k,bi,bj)
            adsigmax(i,j,k) = adsigmax(i,j,k)+addsigmadx(i,j)*op25*
     $masks(i,j,k,bi,bj)
            addsigmadx(i,j) = 0.d0
          end do
        end do
      end do
      do k = 1, nr
        kp1 = min(nr,k+1)
        maskp1 = 1.d0
        if (k .ge. nr) then
          maskp1 = 0.d0
        endif
        kkey = (igmkey-1)*nr+k
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            dsigmadx(ip1,ip2) = comlev1_bibj_k_dsigmadx_16h(ip1,ip2,
     $kkey)
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            dsigmady(ip1,ip2) = comlev1_bibj_k_dsigmady_17h(ip1,ip2,
     $kkey)
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            dsigmadr(ip1,ip2) = comlev1_bibj_k_dsigmadr_18h(ip1,ip2,
     $kkey)
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            kux(ip1,ip2,k,bi,bj) = comlev1_bibj_k_kux_25h(ip1,ip2,kkey)
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            slopex(ip1,ip2) = comlev1_bibj_k_slopex_26h(ip1,ip2,kkey)
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            taperfct(ip1,ip2) = comlev1_bibj_k_taperfct_27h(ip1,ip2,
     $kkey)
          end do
        end do
        if (gm_extradiag) then
          do j = 1-oly+1, sny+oly-1
            do i = 1-olx+1, snx+olx-1
              adslopex(i,j) = adslopex(i,j)+adkuz(i,j,k,bi,bj)*(
     $gm_isopyck-gm_skewflx*gm_background_k)*taperfct(i,j)
              adtaperfct(i,j) = adtaperfct(i,j)+adkuz(i,j,k,bi,bj)*(
     $gm_isopyck-gm_skewflx*gm_background_k)*slopex(i,j)
              adkuz(i,j,k,bi,bj) = 0.d0
            end do
          end do
        endif
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            adkux(i,j,k,bi,bj) = adkux(i,j,k,bi,bj)*(0.5+sign(0.5d0,kux(
     $i,j,k,bi,bj)-gm_kmin_horiz))
          end do
        end do
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            adtaperfct(i,j) = adtaperfct(i,j)+adkux(i,j,k,bi,bj)*
     $gm_isopyck
            adkux(i,j,k,bi,bj) = 0.d0
          end do
        end do
        call adgmredi_slope_limit( adslopex,adslopey,adslopesqr,
     $adtaperfct,dsigmadr,addsigmadr,dsigmadx,addsigmadx,dsigmady,
     $addsigmady,ldd97_lrhow,rc,k )
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            adsigmar(i-1,j,k) = adsigmar(i-1,j,k)+addsigmadr(i,j)*op25*
     $maskw(i,j,k,bi,bj)
            adsigmar(i,j,k) = adsigmar(i,j,k)+addsigmadr(i,j)*op25*
     $maskw(i,j,k,bi,bj)
            adsigmar(i-1,j,kp1) = adsigmar(i-1,j,kp1)+addsigmadr(i,j)*
     $op25*maskp1*maskw(i,j,k,bi,bj)
            adsigmar(i,j,kp1) = adsigmar(i,j,kp1)+addsigmadr(i,j)*op25*
     $maskp1*maskw(i,j,k,bi,bj)
            addsigmadr(i,j) = 0.d0
            adsigmay(i-1,j+1,k) = adsigmay(i-1,j+1,k)+addsigmady(i,j)*
     $op25*maskw(i,j,k,bi,bj)
            adsigmay(i,j+1,k) = adsigmay(i,j+1,k)+addsigmady(i,j)*op25*
     $maskw(i,j,k,bi,bj)
            adsigmay(i-1,j,k) = adsigmay(i-1,j,k)+addsigmady(i,j)*op25*
     $maskw(i,j,k,bi,bj)
            adsigmay(i,j,k) = adsigmay(i,j,k)+addsigmady(i,j)*op25*
     $maskw(i,j,k,bi,bj)
            addsigmady(i,j) = 0.d0
            adsigmax(i,j,k) = adsigmax(i,j,k)+addsigmadx(i,j)*maskw(i,j,
     $k,bi,bj)
            addsigmadx(i,j) = 0.d0
          end do
        end do
      end do
      do k = 1, nr
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            kgm_tmp = gm_isopyck+gm_skewflx*gm_background_k
            adkwz(i,j,k,bi,bj) = adkwz(i,j,k,bi,bj)*gm_isopyck
            adkwy(i,j,k,bi,bj) = adkwy(i,j,k,bi,bj)*kgm_tmp
            adkwx(i,j,k,bi,bj) = adkwx(i,j,k,bi,bj)*kgm_tmp
          end do
        end do
      end do
      do k = 2, nr
        kkey = (igmkey-1)*nr+k
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            dsigmadx(ip1,ip2) = comlev1_bibj_k_dsigmadx_1h(ip1,ip2,kkey)
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            dsigmady(ip1,ip2) = comlev1_bibj_k_dsigmady_2h(ip1,ip2,kkey)
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            dsigmadr(ip1,ip2) = comlev1_bibj_k_dsigmadr_3h(ip1,ip2,kkey)
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            slopex(ip1,ip2) = comlev1_bibj_k_slopex_7h(ip1,ip2,kkey)
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            slopey(ip1,ip2) = comlev1_bibj_k_slopey_8h(ip1,ip2,kkey)
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            slopesqr(ip1,ip2) = comlev1_bibj_k_slopesqr_9h(ip1,ip2,kkey)
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            taperfct(ip1,ip2) = comlev1_bibj_k_taperfct_11h(ip1,ip2,
     $kkey)
          end do
        end do
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            adslopesqr(i,j) = adslopesqr(i,j)+adkwz(i,j,k,bi,bj)*
     $taperfct(i,j)
            adtaperfct(i,j) = adtaperfct(i,j)+adkwz(i,j,k,bi,bj)*
     $slopesqr(i,j)
            adkwz(i,j,k,bi,bj) = 0.d0
            adslopey(i,j) = adslopey(i,j)+adkwy(i,j,k,bi,bj)*taperfct(i,
     $j)
            adtaperfct(i,j) = adtaperfct(i,j)+adkwy(i,j,k,bi,bj)*slopey(
     $i,j)
            adkwy(i,j,k,bi,bj) = 0.d0
            adslopex(i,j) = adslopex(i,j)+adkwx(i,j,k,bi,bj)*taperfct(i,
     $j)
            adtaperfct(i,j) = adtaperfct(i,j)+adkwx(i,j,k,bi,bj)*slopex(
     $i,j)
            adkwx(i,j,k,bi,bj) = 0.d0
          end do
        end do
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            adslopesqr(i,j) = adslopesqr(i,j)*maskc(i,j,k,bi,bj)
            adslopey(i,j) = adslopey(i,j)*maskc(i,j,k,bi,bj)
            adslopex(i,j) = adslopex(i,j)*maskc(i,j,k,bi,bj)
          end do
        end do
        call adgmredi_slope_limit( adslopex,adslopey,adslopesqr,
     $adtaperfct,dsigmadr,addsigmadr,dsigmadx,addsigmadx,dsigmady,
     $addsigmady,ldd97_lrhoc,rf,k )
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adsigmar(i,j,k) = adsigmar(i,j,k)+addsigmadr(i,j)
            addsigmadr(i,j) = 0.d0
          end do
        end do
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            adsigmay(i,j+1,k-1) = adsigmay(i,j+1,k-1)+addsigmady(i,j)*
     $op25*maskc(i,j,k,bi,bj)
            adsigmay(i,j+1,k) = adsigmay(i,j+1,k)+addsigmady(i,j)*op25*
     $maskc(i,j,k,bi,bj)
            adsigmay(i,j,k-1) = adsigmay(i,j,k-1)+addsigmady(i,j)*op25*
     $maskc(i,j,k,bi,bj)
            adsigmay(i,j,k) = adsigmay(i,j,k)+addsigmady(i,j)*op25*
     $maskc(i,j,k,bi,bj)
            addsigmady(i,j) = 0.d0
            adsigmax(i+1,j,k-1) = adsigmax(i+1,j,k-1)+addsigmadx(i,j)*
     $op25*maskc(i,j,k,bi,bj)
            adsigmax(i,j,k-1) = adsigmax(i,j,k-1)+addsigmadx(i,j)*op25*
     $maskc(i,j,k,bi,bj)
            adsigmax(i+1,j,k) = adsigmax(i+1,j,k)+addsigmadx(i,j)*op25*
     $maskc(i,j,k,bi,bj)
            adsigmax(i,j,k) = adsigmax(i,j,k)+addsigmadx(i,j)*op25*
     $maskc(i,j,k,bi,bj)
            addsigmadx(i,j) = 0.d0
          end do
        end do
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adkvz(i,j,k,bi,bj) = 0.d0
            adkuz(i,j,k,bi,bj) = 0.d0
            adkvy(i,j,k,bi,bj) = 0.d0
            adkux(i,j,k,bi,bj) = 0.d0
            adkwz(i,j,k,bi,bj) = 0.d0
            adkwy(i,j,k,bi,bj) = 0.d0
            adkwx(i,j,k,bi,bj) = 0.d0
            adslopesqr(i,j) = 0.d0
            addsigmadr(i,j) = 0.d0
            addsigmady(i,j) = 0.d0
            addsigmadx(i,j) = 0.d0
            adslopey(i,j) = 0.d0
            adslopex(i,j) = 0.d0
          end do
        end do
      end do

      end

      subroutine mdgmredi_calc_tensor( imin, imax, jmin, jmax, sigmax, 
     $sigmay, sigmar, bi, bj, mytime, myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision op25
      parameter ( op25 = 0.25d0 )
      double precision op5
      parameter ( op5 = 0.5d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      real*8 comlev1_bibj_k_baseslope_31h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadbaseslope/ comlev1_bibj_k_baseslope_31h

      real*8 comlev1_bibj_k_baseslope_20h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadbaseslopf/ comlev1_bibj_k_baseslope_20h

      real*8 comlev1_bibj_k_baseslope_4h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadbaseslopg/ comlev1_bibj_k_baseslope_4h

      real*8 comlev1_bibj_k_dsigmadx_16h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmad0/ comlev1_bibj_k_dsigmadx_16h

      real*8 comlev1_bibj_k_dsigmady_2h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmad1/ comlev1_bibj_k_dsigmady_2h

      real*8 comlev1_bibj_k_dsigmadx_1h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmad2/ comlev1_bibj_k_dsigmadx_1h

      real*8 comlev1_bibj_k_dsigmadr_30h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmadr/ comlev1_bibj_k_dsigmadr_30h

      real*8 comlev1_bibj_k_dsigmadr_18h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmads/ comlev1_bibj_k_dsigmadr_18h

      real*8 comlev1_bibj_k_dsigmadr_3h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmadt/ comlev1_bibj_k_dsigmadr_3h

      real*8 comlev1_bibj_k_dsigmadr_10h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmadu/ comlev1_bibj_k_dsigmadr_10h

      real*8 comlev1_bibj_k_dsigmadx_28h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmadx/ comlev1_bibj_k_dsigmadx_28h

      real*8 comlev1_bibj_k_dsigmady_29h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmady/ comlev1_bibj_k_dsigmady_29h

      real*8 comlev1_bibj_k_dsigmady_17h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /caddsigmadz/ comlev1_bibj_k_dsigmady_17h

      real*8 comlev1_bibj_k_htranslay_5h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadhtransla0/ comlev1_bibj_k_htranslay_5h

      real*8 comlev1_bibj_k_htranslay_32h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadhtranslay/ comlev1_bibj_k_htranslay_32h

      real*8 comlev1_bibj_k_htranslay_21h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadhtranslaz/ comlev1_bibj_k_htranslay_21h

      real*8 comlev1_bibj_k_kux_25h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadkuy/ comlev1_bibj_k_kux_25h

      real*8 comlev1_bibj_k_kvy_35h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadkv0/ comlev1_bibj_k_kvy_35h

      real*8 comlev1_bibj_k_kwy_13h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadkw0/ comlev1_bibj_k_kwy_13h

      real*8 comlev1_bibj_k_kwx_12h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadkw1/ comlev1_bibj_k_kwx_12h

      real*8 comlev1_bibj_k_kwz_14h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadkwz/ comlev1_bibj_k_kwz_14h

      real*8 comlev1_bibj_k_locmixlayer_19h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadlocmixlayer/ comlev1_bibj_k_locmixlayer_19h

      real*8 comlev1_bibj_k_reciplambda_33h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadreciplambda/ comlev1_bibj_k_reciplambda_33h

      real*8 comlev1_bibj_k_reciplambda_22h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadreciplambdb/ comlev1_bibj_k_reciplambda_22h

      real*8 comlev1_bibj_k_reciplambda_6h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadreciplambdc/ comlev1_bibj_k_reciplambda_6h

      real*8 comlev1_bibj_k_slopex_7h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadslope0/ comlev1_bibj_k_slopex_7h

      real*8 comlev1_bibj_k_slopesqr_9h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadslopesqr/ comlev1_bibj_k_slopesqr_9h

      real*8 comlev1_bibj_k_slopesqr_23h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadslopesqs/ comlev1_bibj_k_slopesqr_23h

      real*8 comlev1_bibj_k_slopesqr_15h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadslopesqt/ comlev1_bibj_k_slopesqr_15h

      real*8 comlev1_bibj_k_slopex_26h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadslopex/ comlev1_bibj_k_slopex_26h

      real*8 comlev1_bibj_k_slopey_36h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadslopey/ comlev1_bibj_k_slopey_36h

      real*8 comlev1_bibj_k_slopey_8h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadslopez/ comlev1_bibj_k_slopey_8h

      real*8 comlev1_bibj_k_taperfct_37h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadtaperfct/ comlev1_bibj_k_taperfct_37h

      real*8 comlev1_bibj_k_taperfct_27h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadtaperfcu/ comlev1_bibj_k_taperfct_27h

      real*8 comlev1_bibj_k_taperfct_11h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadtaperfcv/ comlev1_bibj_k_taperfct_11h

      real*8 comlev1_bibj_k_taperfct_34h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadtaperfcw/ comlev1_bibj_k_taperfct_34h

      real*8 comlev1_bibj_k_taperfct_24h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadtaperfcx/ comlev1_bibj_k_taperfct_24h

      double precision hmixlayer(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ivdconvcount(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision phihydlow(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rhoinsitu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision totphihyd(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_diag/ phihydlow, totphihyd, rhoinsitu, hmixlayer, 
     $ivdconvcount

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision gm_advect
      double precision gm_rmaxslope
      double precision gm_skewflx
      common /gm_derived_par/ gm_rmaxslope, gm_skewflx, gm_advect

      double precision kux(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kvy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /gm_hortensor/ kux, kvy

      character*(40) gm_taper_scheme
      common /gm_params_c/ gm_taper_scheme

      logical gm_advform
      logical gm_advseparate
      logical gm_extradiag
      logical gm_inmomasstress
      logical gm_mdsio
      logical gm_mnc
      common /gm_params_l/ gm_advform, gm_advseparate, gm_extradiag, 
     $gm_mnc, gm_mdsio, gm_inmomasstress

      double precision gm_background_k
      double precision gm_factrl2dz
      double precision gm_factrl2ml
      double precision gm_isopyck
      double precision gm_kmin_horiz
      double precision gm_maxslope
      double precision gm_maxtranslay
      double precision gm_scrit
      double precision gm_sd
      double precision gm_slopesqcutoff
      double precision gm_small_number
      double precision gm_visbeck_alpha
      double precision gm_visbeck_depth
      double precision gm_visbeck_length
      double precision gm_visbeck_maxslope
      double precision gm_visbeck_maxval_k
      double precision gm_visbeck_mindepth
      double precision gm_visbeck_minval_k
      common /gm_params_r/ gm_isopyck, gm_background_k, gm_maxslope, 
     $gm_kmin_horiz, gm_small_number, gm_slopesqcutoff, 
     $gm_visbeck_alpha, gm_visbeck_length, gm_visbeck_depth, 
     $gm_visbeck_mindepth, gm_visbeck_maxslope, gm_visbeck_minval_k, 
     $gm_visbeck_maxval_k, gm_factrl2dz, gm_factrl2ml, gm_maxtranslay, 
     $gm_scrit, gm_sd

      double precision kuz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kvz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /gm_uvtensor/ kuz, kvz

      double precision kwx(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kwy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kwz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /gm_wtensor/ kwx, kwy, kwz

      integer klowc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_i/ ksurfc, ksurfw, ksurfs, klowc

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer myiter
      integer mythid
      double precision mytime
      double precision sigmar(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision sigmax(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision sigmay(1-olx:snx+olx,1-oly:sny+oly,nr)

C==============================================
C declare local variables
C==============================================
      integer act1
      integer act2
      integer act3
      integer act4
      double precision baseslope(1-olx:snx+olx,1-oly:sny+oly)
      double precision cspd
      double precision dsigmadr(1-olx:snx+olx,1-oly:sny+oly)
      double precision dsigmadx(1-olx:snx+olx,1-oly:sny+oly)
      double precision dsigmady(1-olx:snx+olx,1-oly:sny+oly)
      double precision fcoriloc
      double precision htranslay(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer igmkey
      integer iq0
      integer iq1
      integer iq2
      integer iq3
      integer iq4
      integer iq5
      integer iq6
      integer iq7
      integer iq8
      integer iq9
      integer iqu
      integer iqv
      integer iqw
      integer iqx
      integer iqy
      integer iqz
      integer ir4
      integer ir5
      integer ir6
      integer ir7
      integer ir8
      integer ir9
      integer ira
      integer irb
      integer irc
      integer ird
      integer isa
      integer isb
      integer isc
      integer isd
      integer ise
      integer isf
      integer isg
      integer ish
      integer isi
      integer isj
      integer isk
      integer isl
      integer ism
      integer isn
      integer iso
      integer isp
      integer isq
      integer isr
      integer iss
      integer ist
      integer isu
      integer isv
      integer isw
      integer isx
      integer isy
      integer isz
      integer it0
      integer it1
      integer it2
      integer it3
      integer it4
      integer it5
      integer it6
      integer it7
      integer itm
      integer itn
      integer ito
      integer itp
      integer itq
      integer itr
      integer its
      integer itt
      integer itu
      integer itv
      integer itw
      integer itx
      integer ity
      integer itz
      integer j
      integer k
      double precision kgm_tmp
      integer kkey
      integer klow_s(1-olx:snx+olx,1-oly:sny+oly)
      integer klow_w(1-olx:snx+olx,1-oly:sny+oly)
      integer kp1
      double precision ldd97_lrhoc(1-olx:snx+olx,1-oly:sny+oly)
      double precision ldd97_lrhos(1-olx:snx+olx,1-oly:sny+oly)
      double precision ldd97_lrhow(1-olx:snx+olx,1-oly:sny+oly)
      double precision locmixlayer(1-olx:snx+olx,1-oly:sny+oly)
      double precision lrhoinf
      double precision lrhosup
      double precision maskp1
      integer max1
      integer max2
      integer max3
      double precision reciplambda(1-olx:snx+olx,1-oly:sny+oly)
      double precision slopesqr(1-olx:snx+olx,1-oly:sny+oly)
      double precision slopex(1-olx:snx+olx,1-oly:sny+oly)
      double precision slopey(1-olx:snx+olx,1-oly:sny+oly)
      double precision taperfct(1-olx:snx+olx,1-oly:sny+oly)

C**********************************************
C executable statements of routine
C**********************************************
      act1 = bi-mybxlo(mythid)
      max1 = mybxhi(mythid)-mybxlo(mythid)+1
      act2 = bj-mybylo(mythid)
      max2 = mybyhi(mythid)-mybylo(mythid)+1
      act3 = mythid-1
      max3 = ntx*nty
      act4 = ikey_dynamics-1
      igmkey = act1+1+act2*max1+act3*max1*max2+act4*max1*max2*max3
      if (gm_taper_scheme .eq. 'ldd97' .or. gm_taper_scheme .eq. 'fm07')
     $ then
        cspd = 2.d0
        lrhoinf = 15000.d0
        lrhosup = 1.d+5
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            if (fcori(i,j,bi,bj) .ne. 0.) then
              ldd97_lrhoc(i,j) = cspd/abs(fcori(i,j,bi,bj))
            else
              ldd97_lrhoc(i,j) = lrhosup
            endif
            ldd97_lrhoc(i,j) = max(lrhoinf,min(ldd97_lrhoc(i,j),lrhosup)
     $)
          end do
        end do
        do j = 1-oly, sny+oly
          ldd97_lrhow(1-olx,j) = lrhosup
          do i = 1-olx+1, snx+olx
            fcoriloc = op5*(fcori(i-1,j,bi,bj)+fcori(i,j,bi,bj))
            if (fcoriloc .ne. 0.) then
              ldd97_lrhow(i,j) = cspd/abs(fcoriloc)
            else
              ldd97_lrhow(i,j) = lrhosup
            endif
            ldd97_lrhow(i,j) = max(lrhoinf,min(ldd97_lrhow(i,j),lrhosup)
     $)
          end do
        end do
        do i = 1-olx+1, snx+olx
          ldd97_lrhos(i,1-oly) = lrhosup
        end do
        do j = 1-oly+1, sny+oly
          do i = 1-olx, snx+olx
            fcoriloc = op5*(fcori(i,j-1,bi,bj)+fcori(i,j,bi,bj))
            if (fcoriloc .ne. 0.) then
              ldd97_lrhos(i,j) = cspd/abs(fcoriloc)
            else
              ldd97_lrhos(i,j) = lrhosup
            endif
            ldd97_lrhos(i,j) = max(lrhoinf,min(ldd97_lrhos(i,j),lrhosup)
     $)
          end do
        end do
      else
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            ldd97_lrhoc(i,j) = 0.d0
            ldd97_lrhow(i,j) = 0.d0
            ldd97_lrhos(i,j) = 0.d0
          end do
        end do
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          htranslay(i,j) = r_low(i,j,bi,bj)
          baseslope(i,j) = 0.d0
          reciplambda(i,j) = 0.d0
          locmixlayer(i,j) = 0.d0
        end do
      end do
      if ( .true. ) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            locmixlayer(i,j) = hmixlayer(i,j,bi,bj)
          end do
        end do
      endif
      do k = nr, 2, -1
        kkey = (igmkey-1)*nr+k
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            slopex(i,j) = 0.d0
            slopey(i,j) = 0.d0
            dsigmadx(i,j) = 0.d0
            dsigmady(i,j) = 0.d0
            dsigmadr(i,j) = 0.d0
            slopesqr(i,j) = 0.d0
            kwx(i,j,k,bi,bj) = 0.d0
            kwy(i,j,k,bi,bj) = 0.d0
            kwz(i,j,k,bi,bj) = 0.d0
            kux(i,j,k,bi,bj) = 0.d0
            kvy(i,j,k,bi,bj) = 0.d0
            kuz(i,j,k,bi,bj) = 0.d0
            kvz(i,j,k,bi,bj) = 0.d0
          end do
        end do
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            dsigmadx(i,j) = op25*(sigmax(i+1,j,k-1)+sigmax(i,j,k-1)+
     $sigmax(i+1,j,k)+sigmax(i,j,k))*maskc(i,j,k,bi,bj)
            dsigmady(i,j) = op25*(sigmay(i,j+1,k-1)+sigmay(i,j,k-1)+
     $sigmay(i,j+1,k)+sigmay(i,j,k))*maskc(i,j,k,bi,bj)
          end do
        end do
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            dsigmadr(i,j) = sigmar(i,j,k)
          end do
        end do
        do it7 = 1-oly, sny+oly
          do it6 = 1-olx, snx+olx
            comlev1_bibj_k_dsigmadx_1h(it6,it7,kkey) = dsigmadx(it6,it7)
          end do
        end do
        do it5 = 1-oly, sny+oly
          do it4 = 1-olx, snx+olx
            comlev1_bibj_k_dsigmady_2h(it4,it5,kkey) = dsigmady(it4,it5)
          end do
        end do
        do it3 = 1-oly, sny+oly
          do it2 = 1-olx, snx+olx
            comlev1_bibj_k_dsigmadr_3h(it2,it3,kkey) = dsigmadr(it2,it3)
          end do
        end do
        do it1 = 1-oly, sny+oly
          do it0 = 1-olx, snx+olx
            comlev1_bibj_k_baseslope_4h(it0,it1,kkey) = baseslope(it0,
     $it1)
          end do
        end do
        do itz = 1-oly, sny+oly
          do ity = 1-olx, snx+olx
            comlev1_bibj_k_htranslay_5h(ity,itz,kkey) = htranslay(ity,
     $itz)
          end do
        end do
        do itx = 1-oly, sny+oly
          do itw = 1-olx, snx+olx
            comlev1_bibj_k_reciplambda_6h(itw,itx,kkey) = reciplambda(
     $itw,itx)
          end do
        end do
        call gmredi_slope_limit( slopex,slopey,slopesqr,taperfct,
     $htranslay,baseslope,reciplambda,dsigmadr,dsigmadx,dsigmady,
     $ldd97_lrhoc,locmixlayer,rf,klowc(1-olx,1-oly,bi,bj),k,bi,bj,
     $mytime,myiter,mythid )
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            slopex(i,j) = slopex(i,j)*maskc(i,j,k,bi,bj)
            slopey(i,j) = slopey(i,j)*maskc(i,j,k,bi,bj)
            slopesqr(i,j) = slopesqr(i,j)*maskc(i,j,k,bi,bj)
          end do
        end do
        do itv = 1-oly, sny+oly
          do itu = 1-olx, snx+olx
            comlev1_bibj_k_slopex_7h(itu,itv,kkey) = slopex(itu,itv)
          end do
        end do
        do itt = 1-oly, sny+oly
          do its = 1-olx, snx+olx
            comlev1_bibj_k_slopey_8h(its,itt,kkey) = slopey(its,itt)
          end do
        end do
        do itr = 1-oly, sny+oly
          do itq = 1-olx, snx+olx
            comlev1_bibj_k_slopesqr_9h(itq,itr,kkey) = slopesqr(itq,itr)
          end do
        end do
        do itp = 1-oly, sny+oly
          do ito = 1-olx, snx+olx
            comlev1_bibj_k_dsigmadr_10h(ito,itp,kkey) = dsigmadr(ito,
     $itp)
          end do
        end do
        do itn = 1-oly, sny+oly
          do itm = 1-olx, snx+olx
            comlev1_bibj_k_taperfct_11h(itm,itn,kkey) = taperfct(itm,
     $itn)
          end do
        end do
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            kwx(i,j,k,bi,bj) = slopex(i,j)*taperfct(i,j)
            kwy(i,j,k,bi,bj) = slopey(i,j)*taperfct(i,j)
            kwz(i,j,k,bi,bj) = slopesqr(i,j)*taperfct(i,j)
          end do
        end do
      end do
      do k = 1, nr
        kkey = (igmkey-1)*nr+k
        do isz = 1-oly, sny+oly
          do isy = 1-olx, snx+olx
            comlev1_bibj_k_kwx_12h(isy,isz,kkey) = kwx(isy,isz,k,bi,bj)
          end do
        end do
        do isx = 1-oly, sny+oly
          do isw = 1-olx, snx+olx
            comlev1_bibj_k_kwy_13h(isw,isx,kkey) = kwy(isw,isx,k,bi,bj)
          end do
        end do
        do isv = 1-oly, sny+oly
          do isu = 1-olx, snx+olx
            comlev1_bibj_k_kwz_14h(isu,isv,kkey) = kwz(isu,isv,k,bi,bj)
          end do
        end do
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            kgm_tmp = gm_isopyck+gm_skewflx*gm_background_k
            kwx(i,j,k,bi,bj) = kgm_tmp*kwx(i,j,k,bi,bj)
            kwy(i,j,k,bi,bj) = kgm_tmp*kwy(i,j,k,bi,bj)
            kwz(i,j,k,bi,bj) = gm_isopyck*kwz(i,j,k,bi,bj)
          end do
        end do
      end do
      if ( .true. ) then
        do j = 1-oly, sny+oly
          do i = 2-olx, snx+olx
            locmixlayer(i,j) = (hmixlayer(i-1,j,bi,bj)+hmixlayer(i,j,bi,
     $bj))*op5
          end do
        end do
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          htranslay(i,j) = 0.
          baseslope(i,j) = 0.
          reciplambda(i,j) = 0.
        end do
        do i = 2-olx, snx+olx
          htranslay(i,j) = max(r_low(i-1,j,bi,bj),r_low(i,j,bi,bj))
        end do
      end do
      do k = nr, 1, -1
        kp1 = min(nr,k+1)
        maskp1 = 1.d0
        if (k .ge. nr) then
          maskp1 = 0.d0
        endif
        kkey = (igmkey-1)*nr+k
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            dsigmadx(i,j) = sigmax(i,j,k)*maskw(i,j,k,bi,bj)
            dsigmady(i,j) = op25*(sigmay(i-1,j+1,k)+sigmay(i,j+1,k)+
     $sigmay(i-1,j,k)+sigmay(i,j,k))*maskw(i,j,k,bi,bj)
            dsigmadr(i,j) = op25*(sigmar(i-1,j,k)+sigmar(i,j,k)+(sigmar(
     $i-1,j,kp1)+sigmar(i,j,kp1))*maskp1)*maskw(i,j,k,bi,bj)
          end do
        end do
        do ist = 1-oly, sny+oly
          do iss = 1-olx, snx+olx
            comlev1_bibj_k_slopesqr_15h(iss,ist,kkey) = slopesqr(iss,
     $ist)
          end do
        end do
        do isr = 1-oly, sny+oly
          do isq = 1-olx, snx+olx
            comlev1_bibj_k_dsigmadx_16h(isq,isr,kkey) = dsigmadx(isq,
     $isr)
          end do
        end do
        do isp = 1-oly, sny+oly
          do iso = 1-olx, snx+olx
            comlev1_bibj_k_dsigmady_17h(iso,isp,kkey) = dsigmady(iso,
     $isp)
          end do
        end do
        do isn = 1-oly, sny+oly
          do ism = 1-olx, snx+olx
            comlev1_bibj_k_dsigmadr_18h(ism,isn,kkey) = dsigmadr(ism,
     $isn)
          end do
        end do
        do isl = 1-oly, sny+oly
          do isk = 1-olx, snx+olx
            comlev1_bibj_k_locmixlayer_19h(isk,isl,kkey) = locmixlayer(
     $isk,isl)
          end do
        end do
        do isj = 1-oly, sny+oly
          do isi = 1-olx, snx+olx
            comlev1_bibj_k_baseslope_20h(isi,isj,kkey) = baseslope(isi,
     $isj)
          end do
        end do
        do ish = 1-oly, sny+oly
          do isg = 1-olx, snx+olx
            comlev1_bibj_k_htranslay_21h(isg,ish,kkey) = htranslay(isg,
     $ish)
          end do
        end do
        do isf = 1-oly, sny+oly
          do ise = 1-olx, snx+olx
            comlev1_bibj_k_reciplambda_22h(ise,isf,kkey) = reciplambda(
     $ise,isf)
          end do
        end do
        call gmredi_slope_limit( slopex,slopey,slopesqr,taperfct,
     $htranslay,baseslope,reciplambda,dsigmadr,dsigmadx,dsigmady,
     $ldd97_lrhow,locmixlayer,rc,klow_w,k,bi,bj,mytime,myiter,mythid )
        do isd = 1-oly, sny+oly
          do isc = 1-olx, snx+olx
            comlev1_bibj_k_slopesqr_23h(isc,isd,kkey) = slopesqr(isc,
     $isd)
          end do
        end do
        do isb = 1-oly, sny+oly
          do isa = 1-olx, snx+olx
            comlev1_bibj_k_taperfct_24h(isa,isb,kkey) = taperfct(isa,
     $isb)
          end do
        end do
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            kux(i,j,k,bi,bj) = gm_isopyck*taperfct(i,j)
          end do
        end do
        do ir9 = 1-oly, sny+oly
          do ir8 = 1-olx, snx+olx
            comlev1_bibj_k_kux_25h(ir8,ir9,kkey) = kux(ir8,ir9,k,bi,bj)
          end do
        end do
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            kux(i,j,k,bi,bj) = max(kux(i,j,k,bi,bj),gm_kmin_horiz)
          end do
        end do
        do ir7 = 1-oly, sny+oly
          do ir6 = 1-olx, snx+olx
            comlev1_bibj_k_slopex_26h(ir6,ir7,kkey) = slopex(ir6,ir7)
          end do
        end do
        do ir5 = 1-oly, sny+oly
          do ir4 = 1-olx, snx+olx
            comlev1_bibj_k_taperfct_27h(ir4,ir5,kkey) = taperfct(ir4,
     $ir5)
          end do
        end do
        if (gm_extradiag) then
          do j = 1-oly+1, sny+oly-1
            do i = 1-olx+1, snx+olx-1
              kuz(i,j,k,bi,bj) = (gm_isopyck-gm_skewflx*gm_background_k)
     $*slopex(i,j)*taperfct(i,j)
            end do
          end do
        endif
      end do
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          htranslay(i,j) = 0.
          baseslope(i,j) = 0.
          reciplambda(i,j) = 0.
        end do
      end do
      do j = 2-oly, sny+oly
        do i = 1-olx, snx+olx
          htranslay(i,j) = max(r_low(i,j-1,bi,bj),r_low(i,j,bi,bj))
        end do
      end do
      do k = nr, 1, -1
        kp1 = min(nr,k+1)
        maskp1 = 1.d0
        if (k .ge. nr) then
          maskp1 = 0.d0
        endif
        kkey = (igmkey-1)*nr+k
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            dsigmadx(i,j) = op25*(sigmax(i,j,k)+sigmax(i+1,j,k)+sigmax(
     $i,j-1,k)+sigmax(i+1,j-1,k))*masks(i,j,k,bi,bj)
            dsigmady(i,j) = sigmay(i,j,k)*masks(i,j,k,bi,bj)
            dsigmadr(i,j) = op25*(sigmar(i,j-1,k)+sigmar(i,j,k)+(sigmar(
     $i,j-1,kp1)+sigmar(i,j,kp1))*maskp1)*masks(i,j,k,bi,bj)
          end do
        end do
        do ird = 1-oly, sny+oly
          do irc = 1-olx, snx+olx
            comlev1_bibj_k_dsigmadx_28h(irc,ird,kkey) = dsigmadx(irc,
     $ird)
          end do
        end do
        do irb = 1-oly, sny+oly
          do ira = 1-olx, snx+olx
            comlev1_bibj_k_dsigmady_29h(ira,irb,kkey) = dsigmady(ira,
     $irb)
          end do
        end do
        do iq9 = 1-oly, sny+oly
          do iq8 = 1-olx, snx+olx
            comlev1_bibj_k_dsigmadr_30h(iq8,iq9,kkey) = dsigmadr(iq8,
     $iq9)
          end do
        end do
        do iq7 = 1-oly, sny+oly
          do iq6 = 1-olx, snx+olx
            comlev1_bibj_k_baseslope_31h(iq6,iq7,kkey) = baseslope(iq6,
     $iq7)
          end do
        end do
        do iq5 = 1-oly, sny+oly
          do iq4 = 1-olx, snx+olx
            comlev1_bibj_k_htranslay_32h(iq4,iq5,kkey) = htranslay(iq4,
     $iq5)
          end do
        end do
        do iq3 = 1-oly, sny+oly
          do iq2 = 1-olx, snx+olx
            comlev1_bibj_k_reciplambda_33h(iq2,iq3,kkey) = reciplambda(
     $iq2,iq3)
          end do
        end do
        call gmredi_slope_limit( slopex,slopey,slopesqr,taperfct,
     $htranslay,baseslope,reciplambda,dsigmadr,dsigmadx,dsigmady,
     $ldd97_lrhos,locmixlayer,rc,klow_s,k,bi,bj,mytime,myiter,mythid )
        do iq1 = 1-oly, sny+oly
          do iq0 = 1-olx, snx+olx
            comlev1_bibj_k_taperfct_34h(iq0,iq1,kkey) = taperfct(iq0,
     $iq1)
          end do
        end do
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            kvy(i,j,k,bi,bj) = gm_isopyck*taperfct(i,j)
          end do
        end do
        do iqz = 1-oly, sny+oly
          do iqy = 1-olx, snx+olx
            comlev1_bibj_k_kvy_35h(iqy,iqz,kkey) = kvy(iqy,iqz,k,bi,bj)
          end do
        end do
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            kvy(i,j,k,bi,bj) = max(kvy(i,j,k,bi,bj),gm_kmin_horiz)
          end do
        end do
        do iqx = 1-oly, sny+oly
          do iqw = 1-olx, snx+olx
            comlev1_bibj_k_slopey_36h(iqw,iqx,kkey) = slopey(iqw,iqx)
          end do
        end do
        do iqv = 1-oly, sny+oly
          do iqu = 1-olx, snx+olx
            comlev1_bibj_k_taperfct_37h(iqu,iqv,kkey) = taperfct(iqu,
     $iqv)
          end do
        end do
        if (gm_extradiag) then
          do j = 1-oly+1, sny+oly-1
            do i = 1-olx+1, snx+olx-1
              kvz(i,j,k,bi,bj) = (gm_isopyck-gm_skewflx*gm_background_k)
     $*slopey(i,j)*taperfct(i,j)
            end do
          end do
        endif
      end do
      end

      subroutine adgmredi_calc_tensor_dummy( bi, bj )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adkwx(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adkwy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adkwz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /adgm_wtensor/ adkwx, adkwy, adkwz

C==============================================
C declare arguments
C==============================================
      integer bi
      integer bj

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      integer k

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do k = 1, nr
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            adkwz(i,j,k,bi,bj) = 0.d0
            adkwy(i,j,k,bi,bj) = 0.d0
            adkwx(i,j,k,bi,bj) = 0.d0
          end do
        end do
      end do

      end

      subroutine adgmredi_rtransport( imin, imax, jmin, jmax, bi, bj, k,
     $ tracer, adtracer, traceridentity, addf )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer gad_tr1
      parameter ( gad_tr1 = 3 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision op5
      parameter ( op5 = 0.5d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adkwx(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adkwy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adkwz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /adgm_wtensor/ adkwx, adkwy, adkwz

      double precision kwx(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kwy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kwz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /gm_wtensor/ kwx, kwy, kwz

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

C==============================================
C declare arguments
C==============================================
      double precision addf(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer traceridentity

C==============================================
C declare local variables
C==============================================
      double precision addtdx(1-olx:snx+olx,1-oly:sny+oly)
      double precision addtdy(1-olx:snx+olx,1-oly:sny+oly)
      double precision dtdx(1-olx:snx+olx,1-oly:sny+oly)
      double precision dtdy(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer ip1
      integer ip2
      integer j

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          addtdx(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          addtdy(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (usegmredi .and. k .gt. 1) then
        do j = jmin, jmax
          do i = imin, imax
            dtdx(i,j) = op5*(op5*(maskw(i+1,j,k,bi,bj)*recip_dxc(i+1,j,
     $bi,bj)*(tracer(i+1,j,k,bi,bj)-tracer(i,j,k,bi,bj))+maskw(i,j,k,bi,
     $bj)*recip_dxc(i,j,bi,bj)*(tracer(i,j,k,bi,bj)-tracer(i-1,j,k,bi,
     $bj)))+op5*(maskw(i+1,j,k-1,bi,bj)*recip_dxc(i+1,j,bi,bj)*(tracer(
     $i+1,j,k-1,bi,bj)-tracer(i,j,k-1,bi,bj))+maskw(i,j,k-1,bi,bj)*
     $recip_dxc(i,j,bi,bj)*(tracer(i,j,k-1,bi,bj)-tracer(i-1,j,k-1,bi,
     $bj))))
            dtdy(i,j) = op5*(op5*(masks(i,j,k,bi,bj)*recip_dyc(i,j,bi,
     $bj)*(tracer(i,j,k,bi,bj)-tracer(i,j-1,k,bi,bj))+masks(i,j+1,k,bi,
     $bj)*recip_dyc(i,j+1,bi,bj)*(tracer(i,j+1,k,bi,bj)-tracer(i,j,k,bi,
     $bj)))+op5*(masks(i,j,k-1,bi,bj)*recip_dyc(i,j,bi,bj)*(tracer(i,j,
     $k-1,bi,bj)-tracer(i,j-1,k-1,bi,bj))+masks(i,j+1,k-1,bi,bj)*
     $recip_dyc(i,j+1,bi,bj)*(tracer(i,j+1,k-1,bi,bj)-tracer(i,j,k-1,bi,
     $bj))))
          end do
        end do
        do j = jmin, jmax
          do i = imin, imax
            if (traceridentity .lt. gad_tr1) then
              addtdx(i,j) = addtdx(i,j)-addf(i,j)*ra(i,j,bi,bj)*kwx(i,j,
     $k,bi,bj)
              addtdy(i,j) = addtdy(i,j)-addf(i,j)*ra(i,j,bi,bj)*kwy(i,j,
     $k,bi,bj)
              adkwx(i,j,k,bi,bj) = adkwx(i,j,k,bi,bj)-addf(i,j)*ra(i,j,
     $bi,bj)*dtdx(i,j)
              adkwy(i,j,k,bi,bj) = adkwy(i,j,k,bi,bj)-addf(i,j)*ra(i,j,
     $bi,bj)*dtdy(i,j)
            else
              addtdx(i,j) = addtdx(i,j)-addf(i,j)*ra(i,j,bi,bj)*kwx(i,j,
     $k,bi,bj)
              addtdy(i,j) = addtdy(i,j)-addf(i,j)*ra(i,j,bi,bj)*kwy(i,j,
     $k,bi,bj)
              adkwx(i,j,k,bi,bj) = adkwx(i,j,k,bi,bj)-addf(i,j)*ra(i,j,
     $bi,bj)*dtdx(i,j)
              adkwy(i,j,k,bi,bj) = adkwy(i,j,k,bi,bj)-addf(i,j)*ra(i,j,
     $bi,bj)*dtdy(i,j)
            endif
          end do
        end do
        do j = jmin, jmax
          do i = imin, imax
            adtracer(i,j-1,k-1,bi,bj) = adtracer(i,j-1,k-1,bi,bj)-
     $addtdy(i,j)*op5*op5*masks(i,j,k-1,bi,bj)*recip_dyc(i,j,bi,bj)
            adtracer(i,j-1,k,bi,bj) = adtracer(i,j-1,k,bi,bj)-addtdy(i,
     $j)*op5*op5*masks(i,j,k,bi,bj)*recip_dyc(i,j,bi,bj)
            adtracer(i,j+1,k-1,bi,bj) = adtracer(i,j+1,k-1,bi,bj)+
     $addtdy(i,j)*op5*op5*masks(i,j+1,k-1,bi,bj)*recip_dyc(i,j+1,bi,bj)
            adtracer(i,j+1,k,bi,bj) = adtracer(i,j+1,k,bi,bj)+addtdy(i,
     $j)*op5*op5*masks(i,j+1,k,bi,bj)*recip_dyc(i,j+1,bi,bj)
            adtracer(i,j,k-1,bi,bj) = adtracer(i,j,k-1,bi,bj)+addtdy(i,
     $j)*op5*op5*(masks(i,j,k-1,bi,bj)*recip_dyc(i,j,bi,bj)-masks(i,j+1,
     $k-1,bi,bj)*recip_dyc(i,j+1,bi,bj))
            adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+addtdy(i,j)*
     $op5*op5*(masks(i,j,k,bi,bj)*recip_dyc(i,j,bi,bj)-masks(i,j+1,k,bi,
     $bj)*recip_dyc(i,j+1,bi,bj))
            addtdy(i,j) = 0.d0
            adtracer(i-1,j,k-1,bi,bj) = adtracer(i-1,j,k-1,bi,bj)-
     $addtdx(i,j)*op5*op5*maskw(i,j,k-1,bi,bj)*recip_dxc(i,j,bi,bj)
            adtracer(i+1,j,k-1,bi,bj) = adtracer(i+1,j,k-1,bi,bj)+
     $addtdx(i,j)*op5*op5*maskw(i+1,j,k-1,bi,bj)*recip_dxc(i+1,j,bi,bj)
            adtracer(i,j,k-1,bi,bj) = adtracer(i,j,k-1,bi,bj)+addtdx(i,
     $j)*op5*op5*((-(maskw(i+1,j,k-1,bi,bj)*recip_dxc(i+1,j,bi,bj)))+
     $maskw(i,j,k-1,bi,bj)*recip_dxc(i,j,bi,bj))
            adtracer(i-1,j,k,bi,bj) = adtracer(i-1,j,k,bi,bj)-addtdx(i,
     $j)*op5*op5*maskw(i,j,k,bi,bj)*recip_dxc(i,j,bi,bj)
            adtracer(i+1,j,k,bi,bj) = adtracer(i+1,j,k,bi,bj)+addtdx(i,
     $j)*op5*op5*maskw(i+1,j,k,bi,bj)*recip_dxc(i+1,j,bi,bj)
            adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+addtdx(i,j)*
     $op5*op5*((-(maskw(i+1,j,k,bi,bj)*recip_dxc(i+1,j,bi,bj)))+maskw(i,
     $j,k,bi,bj)*recip_dxc(i,j,bi,bj))
            addtdx(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine adgmredi_slope_limit( adslopex, adslopey, adslopesqr, 
     $adtaperfct, dsigmadr, addsigmadr, dsigmadx, addsigmadx, dsigmady, 
     $addsigmady, lrho, depthz, k )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      double precision pi
      parameter ( pi = 3.1415926535898d0 )
      double precision fpi
      parameter ( fpi = pi )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision op5
      parameter ( op5 = 0.5d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      character*(40) gm_taper_scheme
      common /gm_params_c/ gm_taper_scheme

      double precision gm_background_k
      double precision gm_factrl2dz
      double precision gm_factrl2ml
      double precision gm_isopyck
      double precision gm_kmin_horiz
      double precision gm_maxslope
      double precision gm_maxtranslay
      double precision gm_scrit
      double precision gm_sd
      double precision gm_slopesqcutoff
      double precision gm_small_number
      double precision gm_visbeck_alpha
      double precision gm_visbeck_depth
      double precision gm_visbeck_length
      double precision gm_visbeck_maxslope
      double precision gm_visbeck_maxval_k
      double precision gm_visbeck_mindepth
      double precision gm_visbeck_minval_k
      common /gm_params_r/ gm_isopyck, gm_background_k, gm_maxslope, 
     $gm_kmin_horiz, gm_small_number, gm_slopesqcutoff, 
     $gm_visbeck_alpha, gm_visbeck_length, gm_visbeck_depth, 
     $gm_visbeck_mindepth, gm_visbeck_maxslope, gm_visbeck_minval_k, 
     $gm_visbeck_maxval_k, gm_factrl2dz, gm_factrl2ml, gm_maxtranslay, 
     $gm_scrit, gm_sd

C==============================================
C declare arguments
C==============================================
      double precision addsigmadr(1-olx:snx+olx,1-oly:sny+oly)
      double precision addsigmadx(1-olx:snx+olx,1-oly:sny+oly)
      double precision addsigmady(1-olx:snx+olx,1-oly:sny+oly)
      double precision adslopesqr(1-olx:snx+olx,1-oly:sny+oly)
      double precision adslopex(1-olx:snx+olx,1-oly:sny+oly)
      double precision adslopey(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtaperfct(1-olx:snx+olx,1-oly:sny+oly)
      double precision depthz(*)
      double precision dsigmadr(1-olx:snx+olx,1-oly:sny+oly)
      double precision dsigmadx(1-olx:snx+olx,1-oly:sny+oly)
      double precision dsigmady(1-olx:snx+olx,1-oly:sny+oly)
      integer k
      double precision lrho(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision addrdsigmaltd(1-olx:snx+olx,1-oly:sny+oly)
      double precision adf1
      double precision adf2
      double precision adrnondim
      double precision adsmod
      double precision drdsigmaltd(1-olx:snx+olx,1-oly:sny+oly)
      double precision dsigmadrh(1-olx:snx+olx,1-oly:sny+oly)
      double precision f1
      double precision f2
      double precision gm_bigslope
      integer i
      integer ip1
      integer ip2
      integer j
      double precision maxslopesqr
      double precision rnondim
      double precision slopesqr(1-olx:snx+olx,1-oly:sny+oly)
      double precision slopex(1-olx:snx+olx,1-oly:sny+oly)
      double precision slopey(1-olx:snx+olx,1-oly:sny+oly)
      double precision smod

C----------------------------------------------
C SAVE REQUIRED INPUT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          dsigmadrh(ip1,ip2) = dsigmadr(ip1,ip2)
        end do
      end do

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          addrdsigmaltd(ip1,ip2) = 0.d0
        end do
      end do
      adf1 = 0.d0
      adf2 = 0.d0
      adrnondim = 0.d0
      adsmod = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      gm_bigslope = 100.d0
      if (gm_taper_scheme .eq. 'orig' .or. gm_taper_scheme .eq. 
     $'clipping') then
      else if (gm_taper_scheme .eq. 'fm07') then
      else if (gm_taper_scheme .eq. 'ac02') then
      else
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            if (dsigmadr(i,j) .ne. 0.) then
              if (dsigmadr(i,j) .ge. (-gm_small_number)) then
                dsigmadr(i,j) = -gm_small_number
              endif
            endif
          end do
        end do
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            if (dsigmadr(i,j) .eq. 0.) then
              if (dsigmadx(i,j) .ne. 0.) then
                slopex(i,j) = sign(gm_bigslope,dsigmadx(i,j))
              else
                slopex(i,j) = 0.d0
              endif
              if (dsigmady(i,j) .ne. 0.) then
                slopey(i,j) = sign(gm_bigslope,dsigmady(i,j))
              else
                slopey(i,j) = 0.d0
              endif
            else
              drdsigmaltd(i,j) = 1.d0/dsigmadr(i,j)
              slopex(i,j) = -(dsigmadx(i,j)*drdsigmaltd(i,j))
              slopey(i,j) = -(dsigmady(i,j)*drdsigmaltd(i,j))
            endif
          end do
        end do
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            slopesqr(i,j) = slopex(i,j)*slopex(i,j)+slopey(i,j)*slopey(
     $i,j)
            if (slopesqr(i,j) .gt. gm_slopesqcutoff) then
              slopesqr(i,j) = gm_slopesqcutoff
            endif
          end do
        end do
        if (gm_taper_scheme .eq. 'linear') then
          maxslopesqr = gm_maxslope*gm_maxslope
          do j = 1-oly+1, sny+oly-1
            do i = 1-olx+1, snx+olx-1
              if (slopesqr(i,j) .eq. 0.) then
                adtaperfct(i,j) = 0.d0
              else if (slopesqr(i,j) .gt. maxslopesqr .and. slopesqr(i,
     $j) .lt. gm_slopesqcutoff) then
                adslopesqr(i,j) = adslopesqr(i,j)*(0.5+sign(0.5d0,
     $gm_bigslope*gm_bigslope-slopesqr(i,j)))
                adslopesqr(i,j) = adslopesqr(i,j)-adtaperfct(i,j)*1./(
     $2.*sqrt(maxslopesqr/slopesqr(i,j)))*(maxslopesqr/(slopesqr(i,j)*
     $slopesqr(i,j)))
                adtaperfct(i,j) = 0.d0
              endif
            end do
          end do
        else if (gm_taper_scheme .eq. 'gkw91') then
          maxslopesqr = gm_maxslope*gm_maxslope
          do j = 1-oly+1, sny+oly-1
            do i = 1-olx+1, snx+olx-1
              if (slopesqr(i,j) .eq. 0.) then
                adtaperfct(i,j) = 0.d0
              else if (slopesqr(i,j) .gt. maxslopesqr .and. slopesqr(i,
     $j) .lt. gm_slopesqcutoff) then
                adslopesqr(i,j) = adslopesqr(i,j)-adtaperfct(i,j)*(
     $maxslopesqr/(slopesqr(i,j)*slopesqr(i,j)))
                adtaperfct(i,j) = 0.d0
              endif
            end do
          end do
        else if (gm_taper_scheme .eq. 'dm95') then
          do j = sny+oly-1, 1-oly+1, -1
            adsmod = 0.d0
            do i = snx+olx-1, 1-olx+1, -1
              adsmod = 0.d0
              if (slopesqr(i,j) .eq. 0.) then
                adtaperfct(i,j) = 0.d0
              else if (slopesqr(i,j) .lt. gm_slopesqcutoff) then
                smod = sqrt(slopesqr(i,j))
                adsmod = adsmod-adtaperfct(i,j)*op5*(1.-tanh((gm_scrit-
     $smod)/gm_sd)**2)/gm_sd
                adtaperfct(i,j) = 0.d0
                adslopesqr(i,j) = adslopesqr(i,j)+adsmod*(1./(2.*sqrt(
     $slopesqr(i,j))))
                adsmod = 0.d0
              endif
            end do
          end do
        else if (gm_taper_scheme .eq. 'ldd97') then
          do j = sny+oly-1, 1-oly+1, -1
            do i = snx+olx-1, 1-olx+1, -1
              if (slopesqr(i,j) .eq. 0.) then
                adtaperfct(i,j) = 0.d0
              else if (slopesqr(i,j) .lt. gm_slopesqcutoff) then
                smod = sqrt(slopesqr(i,j))
                f1 = op5*(1.d0+tanh((gm_scrit-smod)/gm_sd))
                rnondim = -(depthz(k)/(lrho(i,j)*smod))
                if (rnondim .ge. 1.d0) then
                  f2 = 1.d0
                else
                  f2 = op5*(1.d0+sin(fpi*(rnondim-op5)))
                endif
                adf1 = adf1+adtaperfct(i,j)*f2
                adf2 = adf2+adtaperfct(i,j)*f1
                adtaperfct(i,j) = 0.d0
                if (rnondim .ge. 1.d0) then
                  adf2 = 0.d0
                else
                  adrnondim = adrnondim+adf2*op5*fpi*cos(fpi*(rnondim-
     $op5))
                  adf2 = 0.d0
                endif
                adsmod = adsmod+adrnondim*(depthz(k)*lrho(i,j)/(lrho(i,
     $j)*smod*lrho(i,j)*smod))
                adrnondim = 0.d0
                adsmod = adsmod-adf1*op5*(1.-tanh((gm_scrit-smod)/gm_sd)
     $**2)/gm_sd
                adf1 = 0.d0
                adslopesqr(i,j) = adslopesqr(i,j)+adsmod*(1./(2.*sqrt(
     $slopesqr(i,j))))
                adsmod = 0.d0
              endif
            end do
          end do
        endif
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            slopesqr(i,j) = slopex(i,j)*slopex(i,j)+slopey(i,j)*slopey(
     $i,j)
            if (slopesqr(i,j) .gt. gm_slopesqcutoff) then
              adtaperfct(i,j) = 0.d0
              adslopesqr(i,j) = 0.d0
            endif
            adtaperfct(i,j) = 0.d0
            adslopex(i,j) = adslopex(i,j)+2*adslopesqr(i,j)*slopex(i,j)
            adslopey(i,j) = adslopey(i,j)+2*adslopesqr(i,j)*slopey(i,j)
            adslopesqr(i,j) = 0.d0
          end do
        end do
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            if (dsigmadr(i,j) .eq. 0.) then
              if (dsigmady(i,j) .ne. 0.) then
                adslopey(i,j) = 0.d0
              else
                adslopey(i,j) = 0.d0
              endif
              if (dsigmadx(i,j) .ne. 0.) then
                adslopex(i,j) = 0.d0
              else
                adslopex(i,j) = 0.d0
              endif
            else
              drdsigmaltd(i,j) = 1.d0/dsigmadr(i,j)
              addrdsigmaltd(i,j) = addrdsigmaltd(i,j)-adslopey(i,j)*
     $dsigmady(i,j)
              addsigmady(i,j) = addsigmady(i,j)-adslopey(i,j)*
     $drdsigmaltd(i,j)
              adslopey(i,j) = 0.d0
              addrdsigmaltd(i,j) = addrdsigmaltd(i,j)-adslopex(i,j)*
     $dsigmadx(i,j)
              addsigmadx(i,j) = addsigmadx(i,j)-adslopex(i,j)*
     $drdsigmaltd(i,j)
              adslopex(i,j) = 0.d0
              addsigmadr(i,j) = addsigmadr(i,j)-addrdsigmaltd(i,j)/(
     $dsigmadr(i,j)*dsigmadr(i,j))
              addrdsigmaltd(i,j) = 0.d0
            endif
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            dsigmadr(ip1,ip2) = dsigmadrh(ip1,ip2)
          end do
        end do
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            if (dsigmadr(i,j) .ne. 0.) then
              if (dsigmadr(i,j) .ge. (-gm_small_number)) then
                addsigmadr(i,j) = 0.d0
              endif
            endif
          end do
        end do
      endif

C----------------------------------------------
C FREE DYNAMIC MEMORY
C----------------------------------------------

      end

      subroutine adgmredi_xtransport( imin, imax, jmin, jmax, bi, bj, k,
     $ xa, tracer, adtracer, traceridentity, addf, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer maxpass
      parameter ( maxpass = 2 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision op5
      parameter ( op5 = 0.5d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adkux(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adkvy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /adgm_hortensor/ adkux, adkvy

      double precision adkuz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adkvz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /adgm_uvtensor/ adkuz, adkvz

      real*8 comlev1_gmredi_k_gad_kux_1h(1-olx:snx+olx,1-oly:sny+oly,
     $3600)
      common /cadkux/ comlev1_gmredi_k_gad_kux_1h

      real*8 comlev1_gmredi_k_gad_kuz_2h(1-olx:snx+olx,1-oly:sny+oly,
     $3600)
      common /cadkuz/ comlev1_gmredi_k_gad_kuz_2h

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision kux(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kvy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /gm_hortensor/ kux, kvy

      logical gm_advform
      logical gm_advseparate
      logical gm_extradiag
      logical gm_inmomasstress
      logical gm_mdsio
      logical gm_mnc
      common /gm_params_l/ gm_advform, gm_advseparate, gm_extradiag, 
     $gm_mnc, gm_mdsio, gm_inmomasstress

      double precision kuz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kvz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /gm_uvtensor/ kuz, kvz

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      double precision addf(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k
      integer mythid
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer traceridentity
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer act0
      integer act1
      integer act2
      integer act3
      integer act4
      double precision addtdz(1-olx:snx+olx,1-oly:sny+oly)
      double precision dtdz(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer igadkey
      integer ip1
      integer ip2
      integer j
      integer kkey
      integer km1
      integer kp1
      integer max0
      integer max1
      integer max2
      integer max3

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          addtdz(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      act0 = traceridentity-1
      max0 = maxpass
      act1 = bi-mybxlo(mythid)
      max1 = mybxhi(mythid)-mybxlo(mythid)+1
      act2 = bj-mybylo(mythid)
      max2 = mybyhi(mythid)-mybylo(mythid)+1
      act3 = mythid-1
      max3 = ntx*nty
      act4 = ikey_dynamics-1
      igadkey = act0+1+act1*max0+act2*max0*max1+act3*max0*max1*max2+
     $act4*max0*max1*max2*max3
      kkey = (igadkey-1)*nr+k
      if (usegmredi) then
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            kux(ip1,ip2,k,bi,bj) = comlev1_gmredi_k_gad_kux_1h(ip1,ip2,
     $kkey)
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            kuz(ip1,ip2,k,bi,bj) = comlev1_gmredi_k_gad_kuz_2h(ip1,ip2,
     $kkey)
          end do
        end do
        if (gm_extradiag) then
          km1 = max(k-1,1)
          kp1 = min(k+1,nr)
          do j = jmin, jmax
            do i = imin, imax
              dtdz(i,j) = op5*(op5*recip_drc(k)*(maskc(i-1,j,k,bi,bj)*(
     $tracer(i-1,j,km1,bi,bj)-tracer(i-1,j,k,bi,bj))+maskc(i,j,k,bi,bj)*
     $(tracer(i,j,km1,bi,bj)-tracer(i,j,k,bi,bj)))+op5*recip_drc(kp1)*(
     $maskc(i-1,j,kp1,bi,bj)*(tracer(i-1,j,k,bi,bj)-tracer(i-1,j,kp1,bi,
     $bj))+maskc(i,j,kp1,bi,bj)*(tracer(i,j,k,bi,bj)-tracer(i,j,kp1,bi,
     $bj))))
            end do
          end do
          do j = jmin, jmax
            do i = imin, imax
              addtdz(i,j) = addtdz(i,j)-addf(i,j)*xa(i,j)*kuz(i,j,k,bi,
     $bj)
              adkuz(i,j,k,bi,bj) = adkuz(i,j,k,bi,bj)-addf(i,j)*xa(i,j)*
     $dtdz(i,j)
            end do
          end do
          do j = jmin, jmax
            do i = imin, imax
              adtracer(i-1,j,k,bi,bj) = adtracer(i-1,j,k,bi,bj)+addtdz(
     $i,j)*op5*((-(op5*recip_drc(k)*maskc(i-1,j,k,bi,bj)))+op5*
     $recip_drc(kp1)*maskc(i-1,j,kp1,bi,bj))
              adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+addtdz(i,j)*
     $op5*((-(op5*recip_drc(k)*maskc(i,j,k,bi,bj)))+op5*recip_drc(kp1)*
     $maskc(i,j,kp1,bi,bj))
              adtracer(i-1,j,km1,bi,bj) = adtracer(i-1,j,km1,bi,bj)+
     $addtdz(i,j)*op5*op5*recip_drc(k)*maskc(i-1,j,k,bi,bj)
              adtracer(i,j,km1,bi,bj) = adtracer(i,j,km1,bi,bj)+addtdz(
     $i,j)*op5*op5*recip_drc(k)*maskc(i,j,k,bi,bj)
              adtracer(i-1,j,kp1,bi,bj) = adtracer(i-1,j,kp1,bi,bj)-
     $addtdz(i,j)*op5*op5*recip_drc(kp1)*maskc(i-1,j,kp1,bi,bj)
              adtracer(i,j,kp1,bi,bj) = adtracer(i,j,kp1,bi,bj)-addtdz(
     $i,j)*op5*op5*recip_drc(kp1)*maskc(i,j,kp1,bi,bj)
              addtdz(i,j) = 0.d0
            end do
          end do
        endif
        do j = jmin, jmax
          do i = imin, imax
            adkux(i,j,k,bi,bj) = adkux(i,j,k,bi,bj)-addf(i,j)*xa(i,j)*
     $recip_dxc(i,j,bi,bj)*(tracer(i,j,k,bi,bj)-tracer(i-1,j,k,bi,bj))
            adtracer(i-1,j,k,bi,bj) = adtracer(i-1,j,k,bi,bj)+addf(i,j)*
     $xa(i,j)*kux(i,j,k,bi,bj)*recip_dxc(i,j,bi,bj)
            adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)-addf(i,j)*xa(
     $i,j)*kux(i,j,k,bi,bj)*recip_dxc(i,j,bi,bj)
          end do
        end do
      endif

      end

      subroutine mdgmredi_xtransport( imin, imax, jmin, jmax, bi, bj, k,
     $ xa, tracer, traceridentity, df, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer maxpass
      parameter ( maxpass = 2 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision op5
      parameter ( op5 = 0.5d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      real*8 comlev1_gmredi_k_gad_kux_1h(1-olx:snx+olx,1-oly:sny+oly,
     $3600)
      common /cadkux/ comlev1_gmredi_k_gad_kux_1h

      real*8 comlev1_gmredi_k_gad_kuz_2h(1-olx:snx+olx,1-oly:sny+oly,
     $3600)
      common /cadkuz/ comlev1_gmredi_k_gad_kuz_2h

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision kux(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kvy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /gm_hortensor/ kux, kvy

      logical gm_advform
      logical gm_advseparate
      logical gm_extradiag
      logical gm_inmomasstress
      logical gm_mdsio
      logical gm_mnc
      common /gm_params_l/ gm_advform, gm_advseparate, gm_extradiag, 
     $gm_mnc, gm_mdsio, gm_inmomasstress

      double precision kuz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kvz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /gm_uvtensor/ kuz, kvz

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      integer bi
      integer bj
      double precision df(1-olx:snx+olx,1-oly:sny+oly)
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k
      integer mythid
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer traceridentity
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer act0
      integer act1
      integer act2
      integer act3
      integer act4
      double precision dtdz(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer igadkey
      integer iqa
      integer iqb
      integer iqc
      integer iqd
      integer j
      integer kkey
      integer km1
      integer kp1
      integer max0
      integer max1
      integer max2
      integer max3

C**********************************************
C executable statements of routine
C**********************************************
      act0 = traceridentity-1
      max0 = maxpass
      act1 = bi-mybxlo(mythid)
      max1 = mybxhi(mythid)-mybxlo(mythid)+1
      act2 = bj-mybylo(mythid)
      max2 = mybyhi(mythid)-mybylo(mythid)+1
      act3 = mythid-1
      max3 = ntx*nty
      act4 = ikey_dynamics-1
      igadkey = act0+1+act1*max0+act2*max0*max1+act3*max0*max1*max2+
     $act4*max0*max1*max2*max3
      kkey = (igadkey-1)*nr+k
      if (usegmredi) then
        do iqd = 1-oly, sny+oly
          do iqc = 1-olx, snx+olx
            comlev1_gmredi_k_gad_kux_1h(iqc,iqd,kkey) = kux(iqc,iqd,k,
     $bi,bj)
          end do
        end do
        do iqb = 1-oly, sny+oly
          do iqa = 1-olx, snx+olx
            comlev1_gmredi_k_gad_kuz_2h(iqa,iqb,kkey) = kuz(iqa,iqb,k,
     $bi,bj)
          end do
        end do
        do j = jmin, jmax
          do i = imin, imax
            df(i,j) = df(i,j)-xa(i,j)*kux(i,j,k,bi,bj)*recip_dxc(i,j,bi,
     $bj)*(tracer(i,j,k,bi,bj)-tracer(i-1,j,k,bi,bj))
          end do
        end do
        if (gm_extradiag) then
          km1 = max(k-1,1)
          kp1 = min(k+1,nr)
          do j = jmin, jmax
            do i = imin, imax
              dtdz(i,j) = op5*(op5*recip_drc(k)*(maskc(i-1,j,k,bi,bj)*(
     $tracer(i-1,j,km1,bi,bj)-tracer(i-1,j,k,bi,bj))+maskc(i,j,k,bi,bj)*
     $(tracer(i,j,km1,bi,bj)-tracer(i,j,k,bi,bj)))+op5*recip_drc(kp1)*(
     $maskc(i-1,j,kp1,bi,bj)*(tracer(i-1,j,k,bi,bj)-tracer(i-1,j,kp1,bi,
     $bj))+maskc(i,j,kp1,bi,bj)*(tracer(i,j,k,bi,bj)-tracer(i,j,kp1,bi,
     $bj))))
            end do
          end do
          do j = jmin, jmax
            do i = imin, imax
              df(i,j) = df(i,j)-xa(i,j)*kuz(i,j,k,bi,bj)*dtdz(i,j)
            end do
          end do
        endif
      endif
      end

      subroutine adgmredi_ytransport( imin, imax, jmin, jmax, bi, bj, k,
     $ ya, tracer, adtracer, traceridentity, addf, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer maxpass
      parameter ( maxpass = 2 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision op5
      parameter ( op5 = 0.5d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adkux(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adkvy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /adgm_hortensor/ adkux, adkvy

      double precision adkuz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adkvz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /adgm_uvtensor/ adkuz, adkvz

      real*8 comlev1_gmredi_k_gad_kvy_3h(1-olx:snx+olx,1-oly:sny+oly,
     $3600)
      common /cadkvy/ comlev1_gmredi_k_gad_kvy_3h

      real*8 comlev1_gmredi_k_gad_kvz_4h(1-olx:snx+olx,1-oly:sny+oly,
     $3600)
      common /cadkvz/ comlev1_gmredi_k_gad_kvz_4h

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision kux(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kvy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /gm_hortensor/ kux, kvy

      logical gm_advform
      logical gm_advseparate
      logical gm_extradiag
      logical gm_inmomasstress
      logical gm_mdsio
      logical gm_mnc
      common /gm_params_l/ gm_advform, gm_advseparate, gm_extradiag, 
     $gm_mnc, gm_mdsio, gm_inmomasstress

      double precision kuz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kvz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /gm_uvtensor/ kuz, kvz

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      double precision addf(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k
      integer mythid
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer traceridentity
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer act0
      integer act1
      integer act2
      integer act3
      integer act4
      double precision addtdz(1-olx:snx+olx,1-oly:sny+oly)
      double precision dtdz(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer igadkey
      integer ip1
      integer ip2
      integer j
      integer kkey
      integer km1
      integer kp1
      integer max0
      integer max1
      integer max2
      integer max3

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          addtdz(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      act0 = traceridentity-1
      max0 = maxpass
      act1 = bi-mybxlo(mythid)
      max1 = mybxhi(mythid)-mybxlo(mythid)+1
      act2 = bj-mybylo(mythid)
      max2 = mybyhi(mythid)-mybylo(mythid)+1
      act3 = mythid-1
      max3 = ntx*nty
      act4 = ikey_dynamics-1
      igadkey = act0+1+act1*max0+act2*max0*max1+act3*max0*max1*max2+
     $act4*max0*max1*max2*max3
      kkey = (igadkey-1)*nr+k
      if (usegmredi) then
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            kvy(ip1,ip2,k,bi,bj) = comlev1_gmredi_k_gad_kvy_3h(ip1,ip2,
     $kkey)
          end do
        end do
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            kvz(ip1,ip2,k,bi,bj) = comlev1_gmredi_k_gad_kvz_4h(ip1,ip2,
     $kkey)
          end do
        end do
        if (gm_extradiag) then
          km1 = max(k-1,1)
          kp1 = min(k+1,nr)
          do j = jmin, jmax
            do i = imin, imax
              dtdz(i,j) = op5*(op5*recip_drc(k)*(maskc(i,j-1,k,bi,bj)*(
     $tracer(i,j-1,km1,bi,bj)-tracer(i,j-1,k,bi,bj))+maskc(i,j,k,bi,bj)*
     $(tracer(i,j,km1,bi,bj)-tracer(i,j,k,bi,bj)))+op5*recip_drc(kp1)*(
     $maskc(i,j-1,kp1,bi,bj)*(tracer(i,j-1,k,bi,bj)-tracer(i,j-1,kp1,bi,
     $bj))+maskc(i,j,kp1,bi,bj)*(tracer(i,j,k,bi,bj)-tracer(i,j,kp1,bi,
     $bj))))
            end do
          end do
          do j = jmin, jmax
            do i = imin, imax
              addtdz(i,j) = addtdz(i,j)-addf(i,j)*ya(i,j)*kvz(i,j,k,bi,
     $bj)
              adkvz(i,j,k,bi,bj) = adkvz(i,j,k,bi,bj)-addf(i,j)*ya(i,j)*
     $dtdz(i,j)
            end do
          end do
          do j = jmin, jmax
            do i = imin, imax
              adtracer(i,j-1,k,bi,bj) = adtracer(i,j-1,k,bi,bj)+addtdz(
     $i,j)*op5*((-(op5*recip_drc(k)*maskc(i,j-1,k,bi,bj)))+op5*
     $recip_drc(kp1)*maskc(i,j-1,kp1,bi,bj))
              adtracer(i,j-1,km1,bi,bj) = adtracer(i,j-1,km1,bi,bj)+
     $addtdz(i,j)*op5*op5*recip_drc(k)*maskc(i,j-1,k,bi,bj)
              adtracer(i,j-1,kp1,bi,bj) = adtracer(i,j-1,kp1,bi,bj)-
     $addtdz(i,j)*op5*op5*recip_drc(kp1)*maskc(i,j-1,kp1,bi,bj)
              adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+addtdz(i,j)*
     $op5*((-(op5*recip_drc(k)*maskc(i,j,k,bi,bj)))+op5*recip_drc(kp1)*
     $maskc(i,j,kp1,bi,bj))
              adtracer(i,j,km1,bi,bj) = adtracer(i,j,km1,bi,bj)+addtdz(
     $i,j)*op5*op5*recip_drc(k)*maskc(i,j,k,bi,bj)
              adtracer(i,j,kp1,bi,bj) = adtracer(i,j,kp1,bi,bj)-addtdz(
     $i,j)*op5*op5*recip_drc(kp1)*maskc(i,j,kp1,bi,bj)
              addtdz(i,j) = 0.d0
            end do
          end do
        endif
        do j = jmin, jmax
          do i = imin, imax
            adkvy(i,j,k,bi,bj) = adkvy(i,j,k,bi,bj)-addf(i,j)*ya(i,j)*
     $recip_dyc(i,j,bi,bj)*(tracer(i,j,k,bi,bj)-tracer(i,j-1,k,bi,bj))
            adtracer(i,j-1,k,bi,bj) = adtracer(i,j-1,k,bi,bj)+addf(i,j)*
     $ya(i,j)*kvy(i,j,k,bi,bj)*recip_dyc(i,j,bi,bj)
            adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)-addf(i,j)*ya(
     $i,j)*kvy(i,j,k,bi,bj)*recip_dyc(i,j,bi,bj)
          end do
        end do
      endif

      end

      subroutine mdgmredi_ytransport( imin, imax, jmin, jmax, bi, bj, k,
     $ ya, tracer, traceridentity, df, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer maxpass
      parameter ( maxpass = 2 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision op5
      parameter ( op5 = 0.5d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      real*8 comlev1_gmredi_k_gad_kvy_3h(1-olx:snx+olx,1-oly:sny+oly,
     $3600)
      common /cadkvy/ comlev1_gmredi_k_gad_kvy_3h

      real*8 comlev1_gmredi_k_gad_kvz_4h(1-olx:snx+olx,1-oly:sny+oly,
     $3600)
      common /cadkvz/ comlev1_gmredi_k_gad_kvz_4h

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision kux(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kvy(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /gm_hortensor/ kux, kvy

      logical gm_advform
      logical gm_advseparate
      logical gm_extradiag
      logical gm_inmomasstress
      logical gm_mdsio
      logical gm_mnc
      common /gm_params_l/ gm_advform, gm_advseparate, gm_extradiag, 
     $gm_mnc, gm_mdsio, gm_inmomasstress

      double precision kuz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision kvz(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /gm_uvtensor/ kuz, kvz

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      integer bi
      integer bj
      double precision df(1-olx:snx+olx,1-oly:sny+oly)
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k
      integer mythid
      double precision tracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer traceridentity
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer act0
      integer act1
      integer act2
      integer act3
      integer act4
      double precision dtdz(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer igadkey
      integer iqa
      integer iqb
      integer iqc
      integer iqd
      integer j
      integer kkey
      integer km1
      integer kp1
      integer max0
      integer max1
      integer max2
      integer max3

C**********************************************
C executable statements of routine
C**********************************************
      act0 = traceridentity-1
      max0 = maxpass
      act1 = bi-mybxlo(mythid)
      max1 = mybxhi(mythid)-mybxlo(mythid)+1
      act2 = bj-mybylo(mythid)
      max2 = mybyhi(mythid)-mybylo(mythid)+1
      act3 = mythid-1
      max3 = ntx*nty
      act4 = ikey_dynamics-1
      igadkey = act0+1+act1*max0+act2*max0*max1+act3*max0*max1*max2+
     $act4*max0*max1*max2*max3
      kkey = (igadkey-1)*nr+k
      if (usegmredi) then
        do iqd = 1-oly, sny+oly
          do iqc = 1-olx, snx+olx
            comlev1_gmredi_k_gad_kvy_3h(iqc,iqd,kkey) = kvy(iqc,iqd,k,
     $bi,bj)
          end do
        end do
        do iqb = 1-oly, sny+oly
          do iqa = 1-olx, snx+olx
            comlev1_gmredi_k_gad_kvz_4h(iqa,iqb,kkey) = kvz(iqa,iqb,k,
     $bi,bj)
          end do
        end do
        do j = jmin, jmax
          do i = imin, imax
            df(i,j) = df(i,j)-ya(i,j)*kvy(i,j,k,bi,bj)*recip_dyc(i,j,bi,
     $bj)*(tracer(i,j,k,bi,bj)-tracer(i,j-1,k,bi,bj))
          end do
        end do
        if (gm_extradiag) then
          km1 = max(k-1,1)
          kp1 = min(k+1,nr)
          do j = jmin, jmax
            do i = imin, imax
              dtdz(i,j) = op5*(op5*recip_drc(k)*(maskc(i,j-1,k,bi,bj)*(
     $tracer(i,j-1,km1,bi,bj)-tracer(i,j-1,k,bi,bj))+maskc(i,j,k,bi,bj)*
     $(tracer(i,j,km1,bi,bj)-tracer(i,j,k,bi,bj)))+op5*recip_drc(kp1)*(
     $maskc(i,j-1,kp1,bi,bj)*(tracer(i,j-1,k,bi,bj)-tracer(i,j-1,kp1,bi,
     $bj))+maskc(i,j,kp1,bi,bj)*(tracer(i,j,k,bi,bj)-tracer(i,j,kp1,bi,
     $bj))))
            end do
          end do
          do j = jmin, jmax
            do i = imin, imax
              df(i,j) = df(i,j)-ya(i,j)*kvz(i,j,k,bi,bj)*dtdz(i,j)
            end do
          end do
        endif
      endif
      end

      subroutine adgrad_sigma( bi, bj, k, adrhok, adsigkm1, adsigkp1, 
     $adsigmax, adsigmay, adsigmar )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adrhok(1-olx:snx+olx,1-oly:sny+oly)
      double precision adsigkm1(1-olx:snx+olx,1-oly:sny+oly)
      double precision adsigkp1(1-olx:snx+olx,1-oly:sny+oly)
      double precision adsigmar(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adsigmax(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adsigmay(1-olx:snx+olx,1-oly:sny+oly,nr)
      integer bi
      integer bj
      integer k

C==============================================
C declare local variables
C==============================================
      double precision adrholoc(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer ip1
      integer ip2
      integer j

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adrholoc(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (k .eq. 1) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adsigmar(i,j,k) = 0.d0
          end do
        end do
      else
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adsigkm1(i,j) = adsigkm1(i,j)-adsigmar(i,j,k)*maskc(i,j,k,
     $bi,bj)*recip_drc(k)*rksign
            adsigkp1(i,j) = adsigkp1(i,j)+adsigmar(i,j,k)*maskc(i,j,k,
     $bi,bj)*recip_drc(k)*rksign
            adsigmar(i,j,k) = 0.d0
          end do
        end do
      endif
      do j = 1-oly+1, sny+oly
        do i = 1-olx, snx+olx
          adrholoc(i,j-1) = adrholoc(i,j-1)-adsigmay(i,j,k)*masks(i,j,k,
     $bi,bj)*recip_dyc(i,j,bi,bj)
          adrholoc(i,j) = adrholoc(i,j)+adsigmay(i,j,k)*masks(i,j,k,bi,
     $bj)*recip_dyc(i,j,bi,bj)
          adsigmay(i,j,k) = 0.d0
        end do
      end do
      if (usecubedsphereexchange) then
        call adfill_cs_corner_tr_rl( 2, .false. ,adrholoc )
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx+1, snx+olx
          adrholoc(i-1,j) = adrholoc(i-1,j)-adsigmax(i,j,k)*maskw(i,j,k,
     $bi,bj)*recip_dxc(i,j,bi,bj)
          adrholoc(i,j) = adrholoc(i,j)+adsigmax(i,j,k)*maskw(i,j,k,bi,
     $bj)*recip_dxc(i,j,bi,bj)
          adsigmax(i,j,k) = 0.d0
        end do
      end do
      if (usecubedsphereexchange) then
        call adfill_cs_corner_tr_rl( 1, .false. ,adrholoc )
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          adrhok(i,j) = adrhok(i,j)+adrholoc(i,j)
          adrholoc(i,j) = 0.d0
        end do
      end do

      end

      subroutine adimpldiff( bi, bj, imin, imax, jmin, jmax, tracerid, 
     $kapparx, adkapparx, recip_hfac, gxnm1, adgxnm1 )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adgxnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adkapparx(1-olx:snx+olx,1-oly:sny+oly,nr)
      integer bi
      integer bj
      double precision gxnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer imax
      integer imin
      integer jmax
      integer jmin
      double precision kapparx(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision recip_hfac(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      integer tracerid

C==============================================
C declare local variables
C==============================================
      double precision a(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision ada(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adb(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adbet(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adc(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adgam(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adgynm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision b(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision bet(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision c(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision deltatx(nr)
      double precision gam(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision gynm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer i
      integer ip1
      integer ip2
      integer ip3
      integer ip4
      integer ip5
      integer j
      integer k

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip3 = 1, nr
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            ada(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do
      do ip3 = 1, nr
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            adb(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do
      do ip3 = 1, nr
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            adbet(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do
      do ip3 = 1, nr
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            adc(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do
      do ip3 = 1, nr
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            adgam(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adgynm1(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (tracerid .ge. 1) then
        do k = 1, nr
          deltatx(k) = dttracerlev(k)
        end do
      else
        do k = 1, nr
          deltatx(k) = deltatmom
        end do
      endif
      do k = 1, nr
        do j = jmin, jmax
          do i = imin, imax
            gynm1(i,j,k,bi,bj) = 0.d0
          end do
        end do
      end do
      do j = jmin, jmax
        do i = imin, imax
          a(i,j,1) = 0.d0
        end do
      end do
      do k = 2, nr
        do j = jmin, jmax
          do i = imin, imax
            a(i,j,k) = -(deltatx(k)*recip_hfac(i,j,k,bi,bj)*recip_drf(k)
     $*recip_deepfac2c(k)*recip_rhofacc(k)*kapparx(i,j,k)*recip_drc(k)*
     $deepfac2f(k)*rhofacf(k))
            if (recip_hfac(i,j,k-1,bi,bj) .eq. 0.) then
              a(i,j,k) = 0.
            endif
          end do
        end do
      end do
      do k = 1, nr-1
        do j = jmin, jmax
          do i = imin, imax
            c(i,j,k) = -(deltatx(k)*recip_hfac(i,j,k,bi,bj)*recip_drf(k)
     $*recip_deepfac2c(k)*recip_rhofacc(k)*kapparx(i,j,k+1)*recip_drc(k+
     $1)*deepfac2f(k+1)*rhofacf(k+1))
            if (recip_hfac(i,j,k+1,bi,bj) .eq. 0.) then
              c(i,j,k) = 0.
            endif
          end do
        end do
      end do
      do j = jmin, jmax
        do i = imin, imax
          c(i,j,nr) = 0.d0
        end do
      end do
      do k = 1, nr
        do j = jmin, jmax
          do i = imin, imax
            b(i,j,k) = 1.d0-c(i,j,k)-a(i,j,k)
          end do
        end do
      end do
      do k = 1, nr
        do j = jmin, jmax
          do i = imin, imax
            bet(i,j,k) = 1.d0
            gam(i,j,k) = 0.d0
          end do
        end do
      end do
      if (nr .gt. 1) then
        do j = jmin, jmax
          do i = imin, imax
            if (b(i,j,1) .ne. 0.) then
              bet(i,j,1) = 1.d0/b(i,j,1)
            endif
          end do
        end do
      endif
      if (nr .ge. 2) then
        do k = 2, nr
          do j = jmin, jmax
            do i = imin, imax
              gam(i,j,k) = c(i,j,k-1)*bet(i,j,k-1)
              if (b(i,j,k)-a(i,j,k)*gam(i,j,k) .ne. 0.) then
                bet(i,j,k) = 1.d0/(b(i,j,k)-a(i,j,k)*gam(i,j,k))
              endif
            end do
          end do
        end do
      endif
      do j = jmin, jmax
        do i = imin, imax
          gynm1(i,j,1,bi,bj) = gxnm1(i,j,1,bi,bj)*bet(i,j,1)
        end do
      end do
      do k = 2, nr
        do j = jmin, jmax
          do i = imin, imax
            gynm1(i,j,k,bi,bj) = bet(i,j,k)*(gxnm1(i,j,k,bi,bj)-a(i,j,k)
     $*gynm1(i,j,k-1,bi,bj))
          end do
        end do
      end do
      do k = 1, nr
        do j = jmin, jmax
          do i = imin, imax
            adgynm1(i,j,k,bi,bj) = adgynm1(i,j,k,bi,bj)+adgxnm1(i,j,k,
     $bi,bj)
            adgxnm1(i,j,k,bi,bj) = 0.d0
          end do
        end do
      end do
      do k = nr-1, 2, -1
        do j = jmin, jmax
          do i = imin, imax
            gynm1(i,j,k,bi,bj) = gynm1(i,j,k,bi,bj)-gam(i,j,k+1)*gynm1(
     $i,j,k+1,bi,bj)
          end do
        end do
      end do
      do k = 1, nr-1
        do j = jmin, jmax
          do i = imin, imax
            adgam(i,j,k+1) = adgam(i,j,k+1)-adgynm1(i,j,k,bi,bj)*gynm1(
     $i,j,k+1,bi,bj)
            adgynm1(i,j,k+1,bi,bj) = adgynm1(i,j,k+1,bi,bj)-adgynm1(i,j,
     $k,bi,bj)*gam(i,j,k+1)
          end do
        end do
      end do
      do k = 1, nr
        do j = jmin, jmax
          do i = imin, imax
            gynm1(i,j,k,bi,bj) = 0.d0
          end do
        end do
      end do
      do j = jmin, jmax
        do i = imin, imax
          gynm1(i,j,1,bi,bj) = gxnm1(i,j,1,bi,bj)*bet(i,j,1)
        end do
      end do
      do k = 2, nr-1
        do j = jmin, jmax
          do i = imin, imax
            gynm1(i,j,k,bi,bj) = bet(i,j,k)*(gxnm1(i,j,k,bi,bj)-a(i,j,k)
     $*gynm1(i,j,k-1,bi,bj))
          end do
        end do
      end do
      do k = nr, 2, -1
        do j = jmin, jmax
          do i = imin, imax
            ada(i,j,k) = ada(i,j,k)-adgynm1(i,j,k,bi,bj)*bet(i,j,k)*
     $gynm1(i,j,k-1,bi,bj)
            adbet(i,j,k) = adbet(i,j,k)+adgynm1(i,j,k,bi,bj)*(gxnm1(i,j,
     $k,bi,bj)-a(i,j,k)*gynm1(i,j,k-1,bi,bj))
            adgxnm1(i,j,k,bi,bj) = adgxnm1(i,j,k,bi,bj)+adgynm1(i,j,k,
     $bi,bj)*bet(i,j,k)
            adgynm1(i,j,k-1,bi,bj) = adgynm1(i,j,k-1,bi,bj)-adgynm1(i,j,
     $k,bi,bj)*bet(i,j,k)*a(i,j,k)
            adgynm1(i,j,k,bi,bj) = 0.d0
          end do
        end do
      end do
      do j = jmin, jmax
        do i = imin, imax
          adbet(i,j,1) = adbet(i,j,1)+adgynm1(i,j,1,bi,bj)*gxnm1(i,j,1,
     $bi,bj)
          adgxnm1(i,j,1,bi,bj) = adgxnm1(i,j,1,bi,bj)+adgynm1(i,j,1,bi,
     $bj)*bet(i,j,1)
          adgynm1(i,j,1,bi,bj) = 0.d0
        end do
      end do
      do k = 1, nr
        do j = jmin, jmax
          do i = imin, imax
            bet(i,j,k) = 1.d0
          end do
        end do
      end do
      if (nr .gt. 1) then
        do j = jmin, jmax
          do i = imin, imax
            if (b(i,j,1) .ne. 0.) then
              bet(i,j,1) = 1.d0/b(i,j,1)
            endif
          end do
        end do
      endif
      if (nr .ge. 2) then
        do k = 2, nr-1
          do j = jmin, jmax
            do i = imin, imax
              gam(i,j,k) = c(i,j,k-1)*bet(i,j,k-1)
              if (b(i,j,k)-a(i,j,k)*gam(i,j,k) .ne. 0.) then
                bet(i,j,k) = 1.d0/(b(i,j,k)-a(i,j,k)*gam(i,j,k))
              endif
            end do
          end do
        end do
        do k = nr, 2, -1
          do j = jmin, jmax
            do i = imin, imax
              gam(i,j,k) = c(i,j,k-1)*bet(i,j,k-1)
              if (b(i,j,k)-a(i,j,k)*gam(i,j,k) .ne. 0.) then
                ada(i,j,k) = ada(i,j,k)+adbet(i,j,k)*(1.d0*gam(i,j,k)/((
     $b(i,j,k)-a(i,j,k)*gam(i,j,k))*(b(i,j,k)-a(i,j,k)*gam(i,j,k))))
                adb(i,j,k) = adb(i,j,k)-adbet(i,j,k)/((b(i,j,k)-a(i,j,k)
     $*gam(i,j,k))*(b(i,j,k)-a(i,j,k)*gam(i,j,k)))
                adgam(i,j,k) = adgam(i,j,k)+adbet(i,j,k)*(1.d0*a(i,j,k)/
     $((b(i,j,k)-a(i,j,k)*gam(i,j,k))*(b(i,j,k)-a(i,j,k)*gam(i,j,k))))
                adbet(i,j,k) = 0.d0
              endif
              adbet(i,j,k-1) = adbet(i,j,k-1)+adgam(i,j,k)*c(i,j,k-1)
              adc(i,j,k-1) = adc(i,j,k-1)+adgam(i,j,k)*bet(i,j,k-1)
              adgam(i,j,k) = 0.d0
            end do
          end do
        end do
      endif
      if (nr .gt. 1) then
        do j = jmin, jmax
          do i = imin, imax
            if (b(i,j,1) .ne. 0.) then
              adb(i,j,1) = adb(i,j,1)-adbet(i,j,1)/(b(i,j,1)*b(i,j,1))
              adbet(i,j,1) = 0.d0
            endif
          end do
        end do
      endif
      do k = 1, nr
        do j = jmin, jmax
          do i = imin, imax
            ada(i,j,k) = ada(i,j,k)-adb(i,j,k)
            adc(i,j,k) = adc(i,j,k)-adb(i,j,k)
            adb(i,j,k) = 0.d0
          end do
        end do
      end do
      do j = jmin, jmax
        do i = imin, imax
          adc(i,j,nr) = 0.d0
        end do
      end do
      do k = 1, nr-1
        do j = jmin, jmax
          do i = imin, imax
            if (recip_hfac(i,j,k+1,bi,bj) .eq. 0.) then
              adc(i,j,k) = 0.d0
            endif
            adkapparx(i,j,k+1) = adkapparx(i,j,k+1)-adc(i,j,k)*deltatx(
     $k)*recip_hfac(i,j,k,bi,bj)*recip_drf(k)*recip_deepfac2c(k)*
     $recip_rhofacc(k)*recip_drc(k+1)*deepfac2f(k+1)*rhofacf(k+1)
            adc(i,j,k) = 0.d0
          end do
        end do
      end do
      do k = 2, nr
        do j = jmin, jmax
          do i = imin, imax
            if (recip_hfac(i,j,k-1,bi,bj) .eq. 0.) then
              ada(i,j,k) = 0.d0
            endif
            adkapparx(i,j,k) = adkapparx(i,j,k)-ada(i,j,k)*deltatx(k)*
     $recip_hfac(i,j,k,bi,bj)*recip_drf(k)*recip_deepfac2c(k)*
     $recip_rhofacc(k)*recip_drc(k)*deepfac2f(k)*rhofacf(k)
            ada(i,j,k) = 0.d0
          end do
        end do
      end do

      end

      subroutine adini_autodiff
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision addetahdt(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adpmepr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adexact_eta_local/ addetahdt, adpmepr

C==============================================
C declare local variables
C==============================================
      integer ip1
      integer ip2
      integer ip3
      integer ip4

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              addetahdt(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adpmepr(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do

      end

      subroutine adini_dynvars
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adrhoinsitu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision adtotphihyd(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      common /addynvars_diag/ adtotphihyd, adrhoinsitu

      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision adetah(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /addynvars_r_2/ adetah

C==============================================
C declare local variables
C==============================================
      integer ip1
      integer ip2
      integer ip3
      integer ip4
      integer ip5

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adetah(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adetan(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adgsnm1(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adgtnm1(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adgunm1(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adgvnm1(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adsalt(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adtheta(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adtotphihyd(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                aduvel(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                advvel(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adwvel(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do

      end

      subroutine adini_forcing
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adempmr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_empmr/ adempmr

      double precision adfu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_fu/ adfu

      double precision adfv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_fv/ adfv

      double precision adqnet(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_qnet/ adqnet

      double precision adsaltflux(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_saltflux/ adsaltflux

      double precision adsss(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_sss/ adsss

      double precision adsst(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_sst/ adsst

      double precision adqnetm(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /admean_qnet/ adqnetm

      double precision adsurfaceforcings(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingt(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingtice(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingu(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurfaceforcingv(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      common /adsurface_forcing/ adsurfaceforcingu, adsurfaceforcingv, 
     $adsurfaceforcingt, adsurfaceforcings, adsurfaceforcingtice

      double precision adempmr0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adempmr1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adqnet0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adqnet1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsaltflux0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsaltflux1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsss0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsss1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsst0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsst1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtaux0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtaux1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtauy0(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtauy1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adtdfields/ adtaux0, adtauy0, adqnet0, adempmr0, adsst0, 
     $adsss0, adtaux1, adtauy1, adqnet1, adempmr1, adsst1, adsss1, 
     $adsaltflux0, adsaltflux1

C==============================================
C declare local variables
C==============================================
      integer ip1
      integer ip2
      integer ip3
      integer ip4

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adempmr(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adempmr0(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adempmr1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adfu(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adfv(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adqnet(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adqnet0(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adqnet1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adqnetm(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adsaltflux(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adsaltflux0(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adsaltflux1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adsss(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adsss0(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adsss1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adsst(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adsst0(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adsst1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adsurfaceforcingtice(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adtaux0(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adtaux1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adtauy0(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adtauy1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do

      end

      subroutine adinitialise_varia( mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      integer mythid

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      niter0 = nint((starttime-basetime)/deltatclock)
      call admonitor( starttime,niter0,mythid )
      call adexch_xyz_rl( adwvel,mythid )
      call adpackages_init_variables( mythid )
      call adini_autodiff
      call adini_forcing
      call adini_dynvars

      end

      subroutine mdinitialise_varia( mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      integer mythid

C==============================================
C declare local variables
C==============================================
      integer bi
      integer bj

C**********************************************
C executable statements of routine
C**********************************************
      niter0 = nint((starttime-basetime)/deltatclock)
      call ini_depths( mythid )
      call ini_masks_etc( mythid )
      call ini_linear_phisurf( mythid )
      call ini_cg2d( mythid )
      call ini_dynvars( mythid )
      call ini_fields( mythid )
      call ini_forcing( mythid )
      call ini_autodiff( mythid )
      call mdpackages_init_variables( mythid )
      if (starttime .eq. basetime .and. cadjfreq .ne. 0.) then
        do bj = mybylo(mythid), mybyhi(mythid)
          do bi = mybxlo(mythid), mybxhi(mythid)
            call convective_adjustment_ini( bi,bj,starttime,niter0,
     $mythid )
          end do
        end do
      endif
      do bj = mybylo(mythid), mybyhi(mythid)
        do bi = mybxlo(mythid), mybxhi(mythid)
          call integr_continuity( bi,bj,uvel,vvel,starttime,niter0,
     $mythid )
        end do
      end do
      if (exactconserv) then
        call update_etah( starttime,niter0,mythid )
      endif
      call exch_xyz_rl( wvel,mythid )
      call monitor( starttime,niter0,mythid )
      call do_statevars_tave( starttime,niter0,mythid )
      call do_the_model_io(  .false. ,starttime,niter0,mythid )
      end

      subroutine adintegr_continuity( bi, bj, adufld, advfld, mytime )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision adetah(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /addynvars_r_2/ adetah

      double precision addetahdt(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adpmepr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adexact_eta_local/ addetahdt, adpmepr

      double precision adempmr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_empmr/ adempmr

      integer klowc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_i/ ksurfc, ksurfw, ksurfs, klowc

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      double precision mytime

C==============================================
C declare local variables
C==============================================
      double precision adhdivflow(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision facemp
      integer i
      integer ip1
      integer ip2
      integer j
      integer k
      integer ks

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adhdivflow(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adutrans(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advtrans(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do k = 1, nr
        if (k .eq. nr .and. mytime .ne. basetime .and. usingpcoords 
     $.and. fluidiswater .and. userealfreshwaterflux) then
          do j = 1, sny
            do i = 1, snx
              adpmepr(i,j,bi,bj) = adpmepr(i,j,bi,bj)+adwvel(i,j,k,bi,
     $bj)*mass2runit*maskc(i,j,k,bi,bj)
            end do
          end do
        endif
        call adintegrate_for_w( bi,bj,k,adufld,advfld,adwvel )
      end do
      if (exactconserv .and. mytime .ne. starttime) then
        if (implicdiv2dflow .eq. 0.d0) then
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              adetah(i,j,bi,bj) = adetah(i,j,bi,bj)+adetan(i,j,bi,bj)
              adetan(i,j,bi,bj) = 0.d0
            end do
          end do
        else
          do j = 1, sny
            do i = 1, snx
              addetahdt(i,j,bi,bj) = addetahdt(i,j,bi,bj)+adetan(i,j,bi,
     $bj)*implicdiv2dflow*deltatfreesurf
              adetah(i,j,bi,bj) = adetah(i,j,bi,bj)+adetan(i,j,bi,bj)
              adetan(i,j,bi,bj) = 0.d0
            end do
          end do
        endif
      endif
      if (exactconserv) then
        facemp = 0.
        if (fluidiswater .and. userealfreshwaterflux) then
          facemp = mass2runit
        endif
        if (mytime .eq. starttime .and. mytime .ne. basetime .and. 
     $fluidiswater .and. userealfreshwaterflux) then
          do j = 1, sny
            do i = 1, snx
              adpmepr(i,j,bi,bj) = adpmepr(i,j,bi,bj)*runit2mass
              addetahdt(i,j,bi,bj) = addetahdt(i,j,bi,bj)+adpmepr(i,j,
     $bi,bj)
              adhdivflow(i,j) = adhdivflow(i,j)+adpmepr(i,j,bi,bj)*
     $recip_ra(i,j,bi,bj)*recip_deepfac2f(1)
              adpmepr(i,j,bi,bj) = 0.d0
            end do
          end do
          if (usepickupbeforec54) then
            do j = 1, sny
              do i = 1, snx
                adetah(i,j,bi,bj) = adetah(i,j,bi,bj)-addetahdt(i,j,bi,
     $bj)/(implicdiv2dflow*deltatfreesurf)
                adetan(i,j,bi,bj) = adetan(i,j,bi,bj)+addetahdt(i,j,bi,
     $bj)/(implicdiv2dflow*deltatfreesurf)
                addetahdt(i,j,bi,bj) = 0.d0
              end do
            end do
          endif
        else if (mytime .eq. starttime) then
          do j = 1, sny
            do i = 1, snx
              ks = ksurfc(i,j,bi,bj)
              adhdivflow(i,j) = adhdivflow(i,j)-addetahdt(i,j,bi,bj)*
     $recip_ra(i,j,bi,bj)*recip_deepfac2f(ks)
              addetahdt(i,j,bi,bj) = 0.d0
              adpmepr(i,j,bi,bj) = 0.d0
            end do
          end do
        else
          do j = 1, sny
            do i = 1, snx
              ks = ksurfc(i,j,bi,bj)
              adempmr(i,j,bi,bj) = adempmr(i,j,bi,bj)-addetahdt(i,j,bi,
     $bj)*facemp
              adhdivflow(i,j) = adhdivflow(i,j)-addetahdt(i,j,bi,bj)*
     $recip_ra(i,j,bi,bj)*recip_deepfac2f(ks)
              addetahdt(i,j,bi,bj) = 0.d0
            end do
          end do
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              adempmr(i,j,bi,bj) = adempmr(i,j,bi,bj)-adpmepr(i,j,bi,bj)
              adpmepr(i,j,bi,bj) = 0.d0
            end do
          end do
        endif
        do k = nr, 1, -1
          do j = 1, sny
            do i = 1, snx
              adutrans(i+1,j) = adutrans(i+1,j)+adhdivflow(i,j)*maskc(i,
     $j,k,bi,bj)
              adutrans(i,j) = adutrans(i,j)-adhdivflow(i,j)*maskc(i,j,k,
     $bi,bj)
              advtrans(i,j+1) = advtrans(i,j+1)+adhdivflow(i,j)*maskc(i,
     $j,k,bi,bj)
              advtrans(i,j) = advtrans(i,j)-adhdivflow(i,j)*maskc(i,j,k,
     $bi,bj)
            end do
          end do
          do j = 1, sny+1
            do i = 1, snx+1
              advfld(i,j,k,bi,bj) = advfld(i,j,k,bi,bj)+advtrans(i,j)*
     $dxg(i,j,bi,bj)*deepfacc(k)*rhofacc(k)*drf(k)*hfacs(i,j,k,bi,bj)
              advtrans(i,j) = 0.d0
              adufld(i,j,k,bi,bj) = adufld(i,j,k,bi,bj)+adutrans(i,j)*
     $dyg(i,j,bi,bj)*deepfacc(k)*rhofacc(k)*drf(k)*hfacw(i,j,k,bi,bj)
              adutrans(i,j) = 0.d0
            end do
          end do
        end do
      endif

      end

      subroutine adintegrate_for_w( bi, bj, k, adufld, advfld, adwfld )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer k

C==============================================
C declare local variables
C==============================================
      double precision adconv2d(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer ip1
      integer ip2
      integer j

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adconv2d(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adutrans(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advtrans(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (rigidlid) then
        if (k .eq. 1) then
          do j = 1, sny
            do i = 1, snx
              adwfld(i,j,k,bi,bj) = 0.d0
            end do
          end do
        else if (k .eq. nr) then
          do j = 1, sny
            do i = 1, snx
              adconv2d(i,j) = adconv2d(i,j)+adwfld(i,j,k,bi,bj)*
     $recip_ra(i,j,bi,bj)*maskc(i,j,k,bi,bj)*maskc(i,j,k-1,bi,bj)*
     $recip_deepfac2f(k)*recip_rhofacf(k)
              adwfld(i,j,k,bi,bj) = 0.d0
            end do
          end do
        else
          do j = 1, sny
            do i = 1, snx
              adconv2d(i,j) = adconv2d(i,j)+adwfld(i,j,k,bi,bj)*
     $recip_ra(i,j,bi,bj)*maskc(i,j,k,bi,bj)*maskc(i,j,k-1,bi,bj)*
     $recip_deepfac2f(k)*recip_rhofacf(k)
              adwfld(i,j,k+1,bi,bj) = adwfld(i,j,k+1,bi,bj)+adwfld(i,j,
     $k,bi,bj)*deepfac2f(k+1)*rhofacf(k+1)*maskc(i,j,k,bi,bj)*maskc(i,j,
     $k-1,bi,bj)*recip_deepfac2f(k)*recip_rhofacf(k)
              adwfld(i,j,k,bi,bj) = 0.d0
            end do
          end do
        endif
      else
        if (k .eq. nr) then
          do j = 1, sny
            do i = 1, snx
              adconv2d(i,j) = adconv2d(i,j)+adwfld(i,j,k,bi,bj)*
     $recip_ra(i,j,bi,bj)*maskc(i,j,k,bi,bj)*recip_deepfac2f(k)*
     $recip_rhofacf(k)
              adwfld(i,j,k,bi,bj) = 0.d0
            end do
          end do
        else
          do j = 1, sny
            do i = 1, snx
              adconv2d(i,j) = adconv2d(i,j)+adwfld(i,j,k,bi,bj)*
     $recip_ra(i,j,bi,bj)*maskc(i,j,k,bi,bj)*recip_deepfac2f(k)*
     $recip_rhofacf(k)
              adwfld(i,j,k+1,bi,bj) = adwfld(i,j,k+1,bi,bj)+adwfld(i,j,
     $k,bi,bj)*deepfac2f(k+1)*rhofacf(k+1)*maskc(i,j,k,bi,bj)*
     $recip_deepfac2f(k)*recip_rhofacf(k)
              adwfld(i,j,k,bi,bj) = 0.d0
            end do
          end do
        endif
      endif
      do j = 1, sny
        do i = 1, snx
          adutrans(i+1,j) = adutrans(i+1,j)-adconv2d(i,j)
          adutrans(i,j) = adutrans(i,j)+adconv2d(i,j)
          advtrans(i,j+1) = advtrans(i,j+1)-adconv2d(i,j)
          advtrans(i,j) = advtrans(i,j)+adconv2d(i,j)
          adconv2d(i,j) = 0.d0
        end do
      end do
      do j = 1, sny+1
        do i = 1, snx+1
          advfld(i,j,k,bi,bj) = advfld(i,j,k,bi,bj)+advtrans(i,j)*dxg(i,
     $j,bi,bj)*deepfacc(k)*rhofacc(k)*drf(k)*hfacs(i,j,k,bi,bj)
          advtrans(i,j) = 0.d0
          adufld(i,j,k,bi,bj) = adufld(i,j,k,bi,bj)+adutrans(i,j)*dyg(i,
     $j,bi,bj)*deepfacc(k)*rhofacc(k)*drf(k)*hfacw(i,j,k,bi,bj)
          adutrans(i,j) = 0.d0
        end do
      end do

      end

      subroutine adload_fields_driver( mytime, myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare common blocks
C==============================================
      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

C==============================================
C declare arguments
C==============================================
      integer myiter
      integer mythid
      double precision mytime

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if ( .not. (useexf .or. useebm)) then
        call adexternal_fields_load( mytime,myiter,mythid )
      endif

      end

      subroutine admom_calc_absvort3( advort3, adomega3 )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

C==============================================
C declare arguments
C==============================================
      double precision adomega3(1-olx:snx+olx,1-oly:sny+oly)
      double precision advort3(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      double precision nonlinfac

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (momadvection) then
        nonlinfac = 1.
      else
        nonlinfac = 0.
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          advort3(i,j) = advort3(i,j)+adomega3(i,j)*nonlinfac
          adomega3(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_calc_hdiv( bi, bj, k, hdivscheme, adufld, advfld,
     $ adhdiv )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adhdiv(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer hdivscheme
      integer k

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (hdivscheme .eq. 1) then
        do j = 1-oly, sny+oly-1
          do i = 1-olx, snx+olx-1
            adufld(i+1,j) = adufld(i+1,j)+adhdiv(i,j)*dyg(i+1,j,bi,bj)*
     $recip_ra(i,j,bi,bj)
            adufld(i,j) = adufld(i,j)-adhdiv(i,j)*dyg(i,j,bi,bj)*
     $recip_ra(i,j,bi,bj)
            advfld(i,j+1) = advfld(i,j+1)+adhdiv(i,j)*dxg(i,j+1,bi,bj)*
     $recip_ra(i,j,bi,bj)
            advfld(i,j) = advfld(i,j)-adhdiv(i,j)*dxg(i,j,bi,bj)*
     $recip_ra(i,j,bi,bj)
            adhdiv(i,j) = 0.d0
          end do
        end do
      else if (hdivscheme .eq. 2) then
        do j = 1-oly, sny+oly-1
          do i = 1-olx, snx+olx-1
            adufld(i+1,j) = adufld(i+1,j)+adhdiv(i,j)*dyg(i+1,j,bi,bj)*
     $hfacw(i+1,j,k,bi,bj)*recip_ra(i,j,bi,bj)*recip_hfacc(i,j,k,bi,bj)
            adufld(i,j) = adufld(i,j)-adhdiv(i,j)*dyg(i,j,bi,bj)*hfacw(
     $i,j,k,bi,bj)*recip_ra(i,j,bi,bj)*recip_hfacc(i,j,k,bi,bj)
            advfld(i,j+1) = advfld(i,j+1)+adhdiv(i,j)*dxg(i,j+1,bi,bj)*
     $hfacs(i,j+1,k,bi,bj)*recip_ra(i,j,bi,bj)*recip_hfacc(i,j,k,bi,bj)
            advfld(i,j) = advfld(i,j)-adhdiv(i,j)*dxg(i,j,bi,bj)*hfacs(
     $i,j,k,bi,bj)*recip_ra(i,j,bi,bj)*recip_hfacc(i,j,k,bi,bj)
            adhdiv(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine admom_calc_ke( bi, bj, k, kescheme, ufld, adufld, vfld,
     $ advfld, adke )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adke(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k
      integer kescheme
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (kescheme .eq. (-1)) then
        do j = 1-oly, sny+oly-1
          do i = 1-olx, snx+olx-1
            adufld(i+1,j) = adufld(i+1,j)+0.25*adke(i,j)*(ufld(i,j)+
     $ufld(i+1,j))
            adufld(i,j) = adufld(i,j)+0.25*adke(i,j)*(ufld(i,j)+ufld(i+
     $1,j))
            advfld(i,j+1) = advfld(i,j+1)+0.25*adke(i,j)*(vfld(i,j)+
     $vfld(i,j+1))
            advfld(i,j) = advfld(i,j)+0.25*adke(i,j)*(vfld(i,j)+vfld(i,
     $j+1))
            adke(i,j) = 0.d0
          end do
        end do
      else if (kescheme .eq. 0) then
        do j = 1-oly, sny+oly-1
          do i = 1-olx, snx+olx-1
            adufld(i+1,j) = adufld(i+1,j)+0.5*adke(i,j)*ufld(i+1,j)
            adufld(i,j) = adufld(i,j)+0.5*adke(i,j)*ufld(i,j)
            advfld(i,j+1) = advfld(i,j+1)+0.5*adke(i,j)*vfld(i,j+1)
            advfld(i,j) = advfld(i,j)+0.5*adke(i,j)*vfld(i,j)
            adke(i,j) = 0.d0
          end do
        end do
      else if (kescheme .eq. 1) then
        do j = 1-oly, sny+oly-1
          do i = 1-olx, snx+olx-1
            adufld(i+1,j) = adufld(i+1,j)+0.5*adke(i,j)*ufld(i+1,j)*raw(
     $i+1,j,bi,bj)*recip_ra(i,j,bi,bj)
            adufld(i,j) = adufld(i,j)+0.5*adke(i,j)*ufld(i,j)*raw(i,j,
     $bi,bj)*recip_ra(i,j,bi,bj)
            advfld(i,j+1) = advfld(i,j+1)+0.5*adke(i,j)*vfld(i,j+1)*ras(
     $i,j+1,bi,bj)*recip_ra(i,j,bi,bj)
            advfld(i,j) = advfld(i,j)+0.5*adke(i,j)*vfld(i,j)*ras(i,j,
     $bi,bj)*recip_ra(i,j,bi,bj)
            adke(i,j) = 0.d0
          end do
        end do
      else if (kescheme .eq. 2) then
        do j = 1-oly, sny+oly-1
          do i = 1-olx, snx+olx-1
            adufld(i+1,j) = adufld(i+1,j)+0.5*adke(i,j)*ufld(i+1,j)*
     $hfacw(i+1,j,k,bi,bj)*recip_hfacc(i,j,k,bi,bj)
            adufld(i,j) = adufld(i,j)+0.5*adke(i,j)*ufld(i,j)*hfacw(i,j,
     $k,bi,bj)*recip_hfacc(i,j,k,bi,bj)
            advfld(i,j+1) = advfld(i,j+1)+0.5*adke(i,j)*vfld(i,j+1)*
     $hfacs(i,j+1,k,bi,bj)*recip_hfacc(i,j,k,bi,bj)
            advfld(i,j) = advfld(i,j)+0.5*adke(i,j)*vfld(i,j)*hfacs(i,j,
     $k,bi,bj)*recip_hfacc(i,j,k,bi,bj)
            adke(i,j) = 0.d0
          end do
        end do
      else if (kescheme .eq. 3) then
        do j = 1-oly, sny+oly-1
          do i = 1-olx, snx+olx-1
            adufld(i+1,j) = adufld(i+1,j)+0.5*adke(i,j)*ufld(i+1,j)*
     $hfacw(i+1,j,k,bi,bj)*raw(i+1,j,bi,bj)*recip_hfacc(i,j,k,bi,bj)*
     $recip_ra(i,j,bi,bj)
            adufld(i,j) = adufld(i,j)+0.5*adke(i,j)*ufld(i,j)*hfacw(i,j,
     $k,bi,bj)*raw(i,j,bi,bj)*recip_hfacc(i,j,k,bi,bj)*recip_ra(i,j,bi,
     $bj)
            advfld(i,j+1) = advfld(i,j+1)+0.5*adke(i,j)*vfld(i,j+1)*
     $hfacs(i,j+1,k,bi,bj)*ras(i,j+1,bi,bj)*recip_hfacc(i,j,k,bi,bj)*
     $recip_ra(i,j,bi,bj)
            advfld(i,j) = advfld(i,j)+0.5*adke(i,j)*vfld(i,j)*hfacs(i,j,
     $k,bi,bj)*ras(i,j,bi,bj)*recip_hfacc(i,j,k,bi,bj)*recip_ra(i,j,bi,
     $bj)
            adke(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine admom_calc_relvort3( bi, bj, adufld, advfld, advort3 )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advort3(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      integer myface
      logical northeastcorner
      logical northwestcorner
      logical southeastcorner
      logical southwestcorner

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (usecubedsphereexchange) then
        myface = bi
        southwestcorner =  .true. 
        southeastcorner =  .true. 
        northwestcorner =  .true. 
        northeastcorner =  .true. 
        if (northeastcorner) then
          i = snx+1
          j = sny+1
          if (mod(myface,2) .eq. 1) then
            adufld(i,j-1) = adufld(i,j-1)+advort3(i,j)*recip_raz(i,j,bi,
     $bj)*dxc(i,j-1,bi,bj)
            adufld(i,j) = adufld(i,j)-advort3(i,j)*recip_raz(i,j,bi,bj)*
     $dxc(i,j,bi,bj)
            advfld(i-1,j) = advfld(i-1,j)-advort3(i,j)*recip_raz(i,j,bi,
     $bj)*dyc(i-1,j,bi,bj)
            advort3(i,j) = 0.d0
          else
            adufld(i,j-1) = adufld(i,j-1)+advort3(i,j)*recip_raz(i,j,bi,
     $bj)*dxc(i,j-1,bi,bj)
            adufld(i,j) = adufld(i,j)-advort3(i,j)*recip_raz(i,j,bi,bj)*
     $dxc(i,j,bi,bj)
            advfld(i-1,j) = advfld(i-1,j)-advort3(i,j)*recip_raz(i,j,bi,
     $bj)*dyc(i-1,j,bi,bj)
            advort3(i,j) = 0.d0
          endif
        endif
        if (northwestcorner) then
          i = 1
          j = sny+1
          if (myface .eq. 1) then
            adufld(i,j-1) = adufld(i,j-1)+advort3(i,j)*recip_raz(i,j,bi,
     $bj)*dxc(i,j-1,bi,bj)
            adufld(i,j) = adufld(i,j)-advort3(i,j)*recip_raz(i,j,bi,bj)*
     $dxc(i,j,bi,bj)
            advfld(i,j) = advfld(i,j)+advort3(i,j)*recip_raz(i,j,bi,bj)*
     $dyc(i,j,bi,bj)
            advort3(i,j) = 0.d0
          else if (myface .eq. 3) then
            adufld(i,j-1) = adufld(i,j-1)+advort3(i,j)*recip_raz(i,j,bi,
     $bj)*dxc(i,j-1,bi,bj)
            adufld(i,j) = adufld(i,j)-advort3(i,j)*recip_raz(i,j,bi,bj)*
     $dxc(i,j,bi,bj)
            advfld(i,j) = advfld(i,j)+advort3(i,j)*recip_raz(i,j,bi,bj)*
     $dyc(i,j,bi,bj)
            advort3(i,j) = 0.d0
          else
            adufld(i,j-1) = adufld(i,j-1)+advort3(i,j)*recip_raz(i,j,bi,
     $bj)*dxc(i,j-1,bi,bj)
            adufld(i,j) = adufld(i,j)-advort3(i,j)*recip_raz(i,j,bi,bj)*
     $dxc(i,j,bi,bj)
            advfld(i,j) = advfld(i,j)+advort3(i,j)*recip_raz(i,j,bi,bj)*
     $dyc(i,j,bi,bj)
            advort3(i,j) = 0.d0
          endif
        endif
        if (southeastcorner) then
          i = snx+1
          j = 1
          if (myface .eq. 2) then
            adufld(i,j-1) = adufld(i,j-1)+advort3(i,j)*recip_raz(i,j,bi,
     $bj)*dxc(i,j-1,bi,bj)
            adufld(i,j) = adufld(i,j)-advort3(i,j)*recip_raz(i,j,bi,bj)*
     $dxc(i,j,bi,bj)
            advfld(i-1,j) = advfld(i-1,j)-advort3(i,j)*recip_raz(i,j,bi,
     $bj)*dyc(i-1,j,bi,bj)
            advort3(i,j) = 0.d0
          else if (myface .eq. 4) then
            adufld(i,j-1) = adufld(i,j-1)+advort3(i,j)*recip_raz(i,j,bi,
     $bj)*dxc(i,j-1,bi,bj)
            adufld(i,j) = adufld(i,j)-advort3(i,j)*recip_raz(i,j,bi,bj)*
     $dxc(i,j,bi,bj)
            advfld(i-1,j) = advfld(i-1,j)-advort3(i,j)*recip_raz(i,j,bi,
     $bj)*dyc(i-1,j,bi,bj)
            advort3(i,j) = 0.d0
          else
            adufld(i,j-1) = adufld(i,j-1)+advort3(i,j)*recip_raz(i,j,bi,
     $bj)*dxc(i,j-1,bi,bj)
            adufld(i,j) = adufld(i,j)-advort3(i,j)*recip_raz(i,j,bi,bj)*
     $dxc(i,j,bi,bj)
            advfld(i-1,j) = advfld(i-1,j)-advort3(i,j)*recip_raz(i,j,bi,
     $bj)*dyc(i-1,j,bi,bj)
            advort3(i,j) = 0.d0
          endif
        endif
        if (southwestcorner) then
          i = 1
          j = 1
          adufld(i,j-1) = adufld(i,j-1)+advort3(i,j)*recip_raz(i,j,bi,
     $bj)*dxc(i,j-1,bi,bj)
          adufld(i,j) = adufld(i,j)-advort3(i,j)*recip_raz(i,j,bi,bj)*
     $dxc(i,j,bi,bj)
          advfld(i,j) = advfld(i,j)+advort3(i,j)*recip_raz(i,j,bi,bj)*
     $dyc(i,j,bi,bj)
          advort3(i,j) = 0.d0
        endif
      endif
      do j = 2-oly, sny+oly
        do i = 2-olx, snx+olx
          adufld(i,j-1) = adufld(i,j-1)+advort3(i,j)*recip_raz(i,j,bi,
     $bj)*dxc(i,j-1,bi,bj)
          adufld(i,j) = adufld(i,j)-advort3(i,j)*recip_raz(i,j,bi,bj)*
     $dxc(i,j,bi,bj)
          advfld(i-1,j) = advfld(i-1,j)-advort3(i,j)*recip_raz(i,j,bi,
     $bj)*dyc(i-1,j,bi,bj)
          advfld(i,j) = advfld(i,j)+advort3(i,j)*recip_raz(i,j,bi,bj)*
     $dyc(i,j,bi,bj)
          advort3(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_calc_rtrans( k, bi, bj, adrtransu, adrtransv )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adrtransu(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrtransv(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (k .gt. nr) then
        do j = 1-oly+1, sny+oly
          do i = 1-olx+1, snx+olx
            adrtransv(i,j) = 0.d0
            adrtransu(i,j) = 0.d0
          end do
        end do
      else
        do j = 1-oly+1, sny+oly
          do i = 1-olx+1, snx+olx
            adwvel(i,j-1,k,bi,bj) = adwvel(i,j-1,k,bi,bj)+0.5d0*
     $adrtransv(i,j)*ra(i,j-1,bi,bj)*deepfac2f(k)*rhofacf(k)
            adwvel(i,j,k,bi,bj) = adwvel(i,j,k,bi,bj)+0.5d0*adrtransv(i,
     $j)*ra(i,j,bi,bj)*deepfac2f(k)*rhofacf(k)
            adrtransv(i,j) = 0.d0
            adwvel(i-1,j,k,bi,bj) = adwvel(i-1,j,k,bi,bj)+0.5d0*
     $adrtransu(i,j)*ra(i-1,j,bi,bj)*deepfac2f(k)*rhofacf(k)
            adwvel(i,j,k,bi,bj) = adwvel(i,j,k,bi,bj)+0.5d0*adrtransu(i,
     $j)*ra(i,j,bi,bj)*deepfac2f(k)*rhofacf(k)
            adrtransu(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine admom_calc_strain( bi, bj, adufld, advfld, adstrain )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adstrain(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 2-oly, sny+oly
        do i = 2-olx, snx+olx
          adufld(i,j-1) = adufld(i,j-1)-adstrain(i,j)*dxc(i,j-1,bi,bj)*
     $recip_raz(i,j,bi,bj)
          adufld(i,j) = adufld(i,j)+adstrain(i,j)*dxc(i,j,bi,bj)*
     $recip_raz(i,j,bi,bj)
          advfld(i-1,j) = advfld(i-1,j)-adstrain(i,j)*dyc(i-1,j,bi,bj)*
     $recip_raz(i,j,bi,bj)
          advfld(i,j) = advfld(i,j)+adstrain(i,j)*dyc(i,j,bi,bj)*
     $recip_raz(i,j,bi,bj)
          adstrain(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_calc_tension( bi, bj, adufld, advfld, adtension )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adtension(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly, sny+oly-1
        do i = 1-olx, snx+olx-1
          adufld(i+1,j) = adufld(i+1,j)+adtension(i,j)*dyg(i+1,j,bi,bj)*
     $recip_ra(i,j,bi,bj)
          adufld(i,j) = adufld(i,j)-adtension(i,j)*dyg(i,j,bi,bj)*
     $recip_ra(i,j,bi,bj)
          advfld(i,j+1) = advfld(i,j+1)-adtension(i,j)*dxg(i,j+1,bi,bj)*
     $recip_ra(i,j,bi,bj)
          advfld(i,j) = advfld(i,j)+adtension(i,j)*dxg(i,j,bi,bj)*
     $recip_ra(i,j,bi,bj)
          adtension(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_calc_visc( bi, bj, k, adviscah_z, adviscah_d, 
     $advisca4_z, advisca4_d, hdiv, adhdiv, vort3, advort3, tension, 
     $adtension, strain, adstrain, ke, adke, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision pi
      parameter ( pi = 3.1415926535898d0 )

C==============================================
C declare common blocks
C==============================================
      real*8 comlev1_mom_ijk_loop_visca4_zsm(2116800)
      common /cadvisca4_zsmg/ comlev1_mom_ijk_loop_visca4_zsm

      real*8 comlev1_mom_ijk_loop_viscah_zsm(2116800)
      common /cadviscah_zsmg/ comlev1_mom_ijk_loop_viscah_zsm

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision l2_d(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision l2_z(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision l3_d(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision l3_z(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision l4rdt_d(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision l4rdt_z(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dt
      common /mom_visc_l/ l2_d, l2_z, l3_d, l3_z, l4rdt_d, l4rdt_z, 
     $recip_dt

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

      integer ikey
      integer key
      common /tamckeys/ key, ikey

C==============================================
C declare arguments
C==============================================
      double precision adhdiv(1-olx:snx+olx,1-oly:sny+oly)
      double precision adke(1-olx:snx+olx,1-oly:sny+oly)
      double precision adstrain(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtension(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision advort3(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision hdiv(1-olx:snx+olx,1-oly:sny+oly)
      integer k
      double precision ke(1-olx:snx+olx,1-oly:sny+oly)
      integer mythid
      double precision strain(1-olx:snx+olx,1-oly:sny+oly)
      double precision tension(1-olx:snx+olx,1-oly:sny+oly)
      double precision vort3(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer act1
      integer act2
      integer act3
      integer act4
      double precision adalin
      double precision addivdx(1-olx:snx+olx,1-oly:sny+oly)
      double precision addivdy(1-olx:snx+olx,1-oly:sny+oly)
      double precision adgrddiv
      double precision adgrddivh
      double precision adgrddivi
      double precision adgrddivj
      double precision adgrddivk
      double precision adgrddivl
      double precision adgrddivm
      double precision adgrddivn
      double precision adgrddivo
      double precision adgrdvrt
      double precision adgrdvrth
      double precision adgrdvrti
      double precision adgrdvrtj
      double precision adgrdvrtk
      double precision adgrdvrtl
      double precision adgrdvrtm
      double precision adgrdvrtn
      double precision adgrdvrto
      double precision adkezpt
      double precision adu4scl
      double precision aduscl
      double precision advisca4_dlth(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_dlthh
      double precision advisca4_dmin(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_dsmg(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_zlth(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_zlthh
      double precision advisca4_zmin(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_zsmg(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_dlth(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_dlthh
      double precision adviscah_dmin(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_dsmg(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_dsmgh
      double precision adviscah_zlth(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_zlthh
      double precision adviscah_zmin(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_zsmg(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_zsmgh
      double precision advrtdx(1-olx:snx+olx,1-oly:sny+oly)
      double precision advrtdy(1-olx:snx+olx,1-oly:sny+oly)
      double precision alin
      logical biharmonic
      logical calcleith
      logical calcsmag
      double precision divdx(1-olx:snx+olx,1-oly:sny+oly)
      double precision divdy(1-olx:snx+olx,1-oly:sny+oly)
      double precision grddiv
      double precision grddivh
      double precision grddivi
      double precision grddivj
      double precision grddivk
      double precision grddivl
      double precision grddivm
      double precision grddivn
      double precision grddivo
      double precision grdvrt
      double precision grdvrth
      double precision grdvrti
      double precision grdvrtj
      double precision grdvrtk
      double precision grdvrtl
      double precision grdvrtm
      double precision grdvrtn
      double precision grdvrto
      logical harmonic
      integer i
      integer ip1
      integer ip2
      integer j
      double precision kezpt
      double precision l2
      double precision l2rdt
      double precision l3
      double precision l4rdt
      double precision l5
      double precision leith2fac
      double precision leith4fac
      double precision leithd2fac
      double precision leithd4fac
      integer lockey_1
      integer lockey_2
      integer max1
      integer max2
      integer max3
      double precision smag2fac
      double precision smag4fac
      double precision u4scl
      double precision uscl
      logical usevariableviscosity
      double precision visca4_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_dlth(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_dmax(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_dmin(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_dsmg(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_zlth(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_zmax(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_zmin(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_zsmg(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4re_max
      double precision viscah_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_dlth(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_dmax(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_dmin(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_dsmg(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_zlth(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_zmax(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_zmin(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_zsmg(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscahre_max
      double precision vrtdx(1-olx:snx+olx,1-oly:sny+oly)
      double precision vrtdy(1-olx:snx+olx,1-oly:sny+oly)

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adalin = 0.d0
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          addivdx(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          addivdy(ip1,ip2) = 0.d0
        end do
      end do
      adgrddiv = 0.d0
      adgrdvrt = 0.d0
      adkezpt = 0.d0
      adu4scl = 0.d0
      aduscl = 0.d0
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advisca4_dlth(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advisca4_dmin(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advisca4_dsmg(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advisca4_zlth(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advisca4_zmin(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advisca4_zsmg(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adviscah_dlth(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adviscah_dmin(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adviscah_dsmg(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adviscah_zlth(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adviscah_zmin(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adviscah_zsmg(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advrtdx(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advrtdy(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      act1 = bi-mybxlo(mythid)
      max1 = mybxhi(mythid)-mybxlo(mythid)+1
      act2 = bj-mybylo(mythid)
      max2 = mybyhi(mythid)-mybylo(mythid)+1
      act3 = mythid-1
      max3 = ntx*nty
      act4 = ikey_dynamics-1
      ikey = act1+1+act2*max1+act3*max1*max2+act4*max1*max2*max3
      lockey_1 = (ikey-1)*nr+k
      usevariableviscosity = viscahgrid .ne. 0. .or. visca4grid .ne. 0. 
     $.or. viscc2leith .ne. 0. .or. viscc2leithd .ne. 0. .or. 
     $viscc4leith .ne. 0. .or. viscc4leithd .ne. 0. .or. viscc2smag 
     $.ne. 0. .or. viscc4smag .ne. 0.
      harmonic = viscah .ne. 0. .or. viscahd .ne. 0. .or. viscahz .ne. 
     $0. .or. viscahgrid .ne. 0. .or. viscc2leith .ne. 0. .or. 
     $viscc2leithd .ne. 0. .or. viscc2smag .ne. 0.
      biharmonic = visca4 .ne. 0. .or. visca4d .ne. 0. .or. visca4z 
     $.ne. 0. .or. visca4grid .ne. 0. .or. viscc4leith .ne. 0. .or. 
     $viscc4leithd .ne. 0. .or. viscc4smag .ne. 0.
      if (usevariableviscosity) then
        if (harmonic .and. viscahremax .ne. 0.) then
          viscahre_max = sqrt(2.d0)/viscahremax
        else
          viscahre_max = 0.d0
        endif
        if (biharmonic .and. visca4remax .ne. 0.) then
          visca4re_max = 0.125d0*sqrt(2.d0)/visca4remax
        else
          visca4re_max = 0.d0
        endif
        calcleith = viscc2leith .ne. 0. .or. viscc2leithd .ne. 0. .or. 
     $viscc4leith .ne. 0. .or. viscc4leithd .ne. 0.
        calcsmag = viscc2smag .ne. 0. .or. viscc4smag .ne. 0.
        if (calcsmag) then
          smag2fac = (viscc2smag/pi)**2
          smag4fac = 0.125d0*(viscc4smag/pi)**2
        else
          smag2fac = 0.d0
          smag4fac = 0.d0
        endif
        if (calcleith) then
          if (usefullleith) then
            leith2fac = (viscc2leith/pi)**6
            leithd2fac = (viscc2leithd/pi)**6
            leith4fac = 0.015625d0*(viscc4leith/pi)**6
            leithd4fac = 0.015625d0*(viscc4leithd/pi)**6
          else
            leith2fac = (viscc2leith/pi)**3
            leithd2fac = (viscc2leithd/pi)**3
            leith4fac = 0.125d0*(viscc4leith/pi)**3
            leithd4fac = 0.125d0*(viscc4leithd/pi)**3
          endif
        else
          leith2fac = 0.d0
          leith4fac = 0.d0
          leithd2fac = 0.d0
          leithd4fac = 0.d0
        endif
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            divdx(i,j) = 0.
            divdy(i,j) = 0.
            vrtdx(i,j) = 0.
            vrtdy(i,j) = 0.
          end do
        end do
        if (calcleith) then
          if (usecubedsphereexchange) then
            call fill_cs_corner_tr_rl( 1, .false. ,hdiv,bi,bj,mythid )
          endif
          do j = 2-oly, sny+oly-1
            do i = 2-olx, snx+olx-1
              divdx(i,j) = (hdiv(i,j)-hdiv(i-1,j))*recip_dxc(i,j,bi,bj)
            end do
          end do
          if (usecubedsphereexchange) then
            call fill_cs_corner_tr_rl( 2, .false. ,hdiv,bi,bj,mythid )
          endif
          do j = 2-oly, sny+oly-1
            do i = 2-olx, snx+olx-1
              divdy(i,j) = (hdiv(i,j)-hdiv(i,j-1))*recip_dyc(i,j,bi,bj)
            end do
          end do
          do j = 2-oly, sny+oly
            do i = 2-olx, snx+olx-1
              vrtdx(i,j) = (vort3(i+1,j)-vort3(i,j))*recip_dxg(i,j,bi,
     $bj)*masks(i,j,k,bi,bj)
            end do
          end do
          do j = 2-oly, sny+oly-1
            do i = 2-olx, snx+olx
              vrtdy(i,j) = (vort3(i,j+1)-vort3(i,j))*recip_dyg(i,j,bi,
     $bj)*maskw(i,j,k,bi,bj)
            end do
          end do
        endif
        do j = sny+oly-1, 2-oly, -1
          do i = snx+olx-1, 2-olx, -1
            lockey_2 = i+olx+(snx+2*olx)*(j+oly-1)+(snx+2*olx)*(sny+2*
     $oly)*(lockey_1-1)
            visca4_zsmg(i,j) = comlev1_mom_ijk_loop_visca4_zsm(lockey_2)
            viscah_zsmg(i,j) = comlev1_mom_ijk_loop_viscah_zsm(lockey_2)
            l2 = l2_d(i,j,bi,bj)
            l2rdt = 0.25d0*recip_dt*l2
            l3 = l3_d(i,j,bi,bj)
            l4rdt = l4rdt_d(i,j,bi,bj)
            l5 = l2*l3
            if (viscahre_max .gt. 0. .and. ke(i,j) .gt. 0.) then
              uscl = sqrt(ke(i,j)*l2)*viscahre_max
            else
              uscl = 0.
            endif
            if (visca4re_max .gt. 0. .and. ke(i,j) .gt. 0.) then
              u4scl = sqrt(ke(i,j))*l3*visca4re_max
            else
              u4scl = 0.
            endif
            if (usefullleith .and. calcleith) then
              grdvrt = 0.25d0*(vrtdx(i,j+1)*vrtdx(i,j+1)+vrtdx(i,j)*
     $vrtdx(i,j)+vrtdy(i+1,j)*vrtdy(i+1,j)+vrtdy(i,j)*vrtdy(i,j))
              grddiv = 0.25d0*(divdx(i+1,j)*divdx(i+1,j)+divdx(i,j)*
     $divdx(i,j)+divdy(i,j+1)*divdy(i,j+1)+divdy(i,j)*divdy(i,j))
              viscah_dlth(i,j) = sqrt(leith2fac*grdvrt+leithd2fac*
     $grddiv)*l3
              visca4_dlth(i,j) = sqrt(leith4fac*grdvrt+leithd4fac*
     $grddiv)*l5
            else if (calcleith) then
              grdvrt = max(abs(vrtdx(i,j+1)),abs(vrtdx(i,j)))
              grdvrt = max(grdvrt,abs(vrtdy(i+1,j)))
              grdvrt = max(grdvrt,abs(vrtdy(i,j)))
              grddiv = max(abs(divdx(i+1,j)),abs(divdx(i,j)))
              grddiv = max(grddiv,abs(divdy(i,j+1)))
              grddiv = max(grddiv,abs(divdy(i,j)))
              viscah_dlth(i,j) = (leith2fac*grdvrt+leithd2fac*grddiv)*l3
              visca4_dlth(i,j) = (leith4fac*grdvrt+leithd4fac*grddiv)*l5
            else
              viscah_dlth(i,j) = 0.d0
              visca4_dlth(i,j) = 0.d0
            endif
            if (calcsmag) then
              viscah_dsmg(i,j) = l2*sqrt(tension(i,j)**2+0.25d0*(strain(
     $i+1,j)**2+strain(i,j+1)**2+strain(i,j)**2+strain(i+1,j+1)**2))
              visca4_dsmg(i,j) = smag4fac*l2*viscah_dsmg(i,j)
              viscah_dsmg(i,j) = smag2fac*viscah_dsmg(i,j)
            else
              viscah_dsmg(i,j) = 0.d0
              visca4_dsmg(i,j) = 0.d0
            endif
            alin = viscahd+viscahgrid*l2rdt+viscah_dlth(i,j)+
     $viscah_dsmg(i,j)
            viscah_dmin(i,j) = max(viscahgridmin*l2rdt,uscl)
            viscah_d(i,j) = max(viscah_dmin(i,j),alin)
            viscah_dmax(i,j) = min(viscahgridmax*l2rdt,viscahmax)
            alin = visca4d+visca4grid*l4rdt+visca4_dlth(i,j)+
     $visca4_dsmg(i,j)
            visca4_dmin(i,j) = max(visca4gridmin*l4rdt,u4scl)
            visca4_d(i,j) = max(visca4_dmin(i,j),alin)
            visca4_dmax(i,j) = min(visca4gridmax*l4rdt,visca4max)
            l2 = l2_z(i,j,bi,bj)
            l2rdt = 0.25d0*recip_dt*l2
            l3 = l3_z(i,j,bi,bj)
            l4rdt = l4rdt_z(i,j,bi,bj)
            l5 = l2*l3
            if (viscahre_max .gt. 0. .or. visca4re_max .gt. 0.) then
              kezpt = 0.25d0*(ke(i,j)+ke(i-1,j-1)+ke(i-1,j)+ke(i,j-1))
              if (kezpt .gt. 0.) then
                uscl = sqrt(kezpt*l2)*viscahre_max
                u4scl = sqrt(kezpt)*l3*visca4re_max
              else
                uscl = 0.
                u4scl = 0.
              endif
            else
              uscl = 0.
              u4scl = 0.
            endif
            if (usefullleith .and. calcleith) then
              grdvrt = 0.25d0*(vrtdx(i-1,j)*vrtdx(i-1,j)+vrtdx(i,j)*
     $vrtdx(i,j)+vrtdy(i,j-1)*vrtdy(i,j-1)+vrtdy(i,j)*vrtdy(i,j))
              grddiv = 0.25d0*(divdx(i,j-1)*divdx(i,j-1)+divdx(i,j)*
     $divdx(i,j)+divdy(i-1,j)*divdy(i-1,j)+divdy(i,j)*divdy(i,j))
              viscah_zlth(i,j) = sqrt(leith2fac*grdvrt+leithd2fac*
     $grddiv)*l3
              visca4_zlth(i,j) = sqrt(leith4fac*grdvrt+leithd4fac*
     $grddiv)*l5
            else if (calcleith) then
              grdvrt = max(abs(vrtdx(i-1,j)),abs(vrtdx(i,j)))
              grdvrt = max(grdvrt,abs(vrtdy(i,j-1)))
              grdvrt = max(grdvrt,abs(vrtdy(i,j)))
              grddiv = max(abs(divdx(i,j)),abs(divdx(i,j-1)))
              grddiv = max(grddiv,abs(divdy(i,j)))
              grddiv = max(grddiv,abs(divdy(i-1,j)))
              viscah_zlth(i,j) = (leith2fac*grdvrt+leithd2fac*grddiv)*l3
              visca4_zlth(i,j) = (leith4fac*grdvrt+leithd4fac*grddiv)*l5
            else
              viscah_zlth(i,j) = 0.d0
              visca4_zlth(i,j) = 0.d0
            endif
            if (calcsmag) then
              viscah_zsmg(i,j) = l2*sqrt(strain(i,j)**2+0.25d0*(tension(
     $i,j)**2+tension(i,j-1)**2+tension(i-1,j)**2+tension(i-1,j-1)**2))
              visca4_zsmg(i,j) = smag4fac*l2*viscah_zsmg(i,j)
              viscah_zsmg(i,j) = smag2fac*viscah_zsmg(i,j)
            endif
            alin = viscahz+viscahgrid*l2rdt+viscah_zlth(i,j)+
     $viscah_zsmg(i,j)
            viscah_zmin(i,j) = max(viscahgridmin*l2rdt,uscl)
            viscah_z(i,j) = max(viscah_zmin(i,j),alin)
            viscah_zmax(i,j) = min(viscahgridmax*l2rdt,viscahmax)
            alin = visca4z+visca4grid*l4rdt+visca4_zlth(i,j)+
     $visca4_zsmg(i,j)
            visca4_zmin(i,j) = max(visca4gridmin*l4rdt,u4scl)
            visca4_z(i,j) = max(visca4_zmin(i,j),alin)
            visca4_zmax(i,j) = min(visca4gridmax*l4rdt,visca4max)
            advisca4_z(i,j) = advisca4_z(i,j)*(0.5-sign(0.5d0,visca4_z(
     $i,j)-visca4_zmax(i,j)))
            adalin = adalin+advisca4_z(i,j)*(0.5-sign(0.5d0,visca4_zmin(
     $i,j)-alin))
            advisca4_zmin(i,j) = advisca4_zmin(i,j)+advisca4_z(i,j)*(
     $0.5+sign(0.5d0,visca4_zmin(i,j)-alin))
            advisca4_z(i,j) = 0.d0
            adu4scl = adu4scl+advisca4_zmin(i,j)*(0.5-sign(0.5d0,
     $visca4gridmin*l4rdt-u4scl))
            advisca4_zmin(i,j) = 0.d0
            advisca4_zlth(i,j) = advisca4_zlth(i,j)+adalin
            advisca4_zsmg(i,j) = advisca4_zsmg(i,j)+adalin
            adalin = 0.d0
            adviscah_z(i,j) = adviscah_z(i,j)*(0.5-sign(0.5d0,viscah_z(
     $i,j)-viscah_zmax(i,j)))
            alin = viscahz+viscahgrid*l2rdt+viscah_zlth(i,j)+
     $viscah_zsmg(i,j)
            adalin = adalin+adviscah_z(i,j)*(0.5-sign(0.5d0,viscah_zmin(
     $i,j)-alin))
            adviscah_zmin(i,j) = adviscah_zmin(i,j)+adviscah_z(i,j)*(
     $0.5+sign(0.5d0,viscah_zmin(i,j)-alin))
            adviscah_z(i,j) = 0.d0
            aduscl = aduscl+adviscah_zmin(i,j)*(0.5-sign(0.5d0,
     $viscahgridmin*l2rdt-uscl))
            adviscah_zmin(i,j) = 0.d0
            adviscah_zlth(i,j) = adviscah_zlth(i,j)+adalin
            adviscah_zsmg(i,j) = adviscah_zsmg(i,j)+adalin
            adalin = 0.d0
            if (calcsmag) then
              adviscah_zsmg(i,j) = adviscah_zsmg(i,j)*smag2fac
              adviscah_zsmg(i,j) = adviscah_zsmg(i,j)+advisca4_zsmg(i,j)
     $*smag4fac*l2
              advisca4_zsmg(i,j) = 0.d0
              adviscah_zsmgh = adviscah_zsmg(i,j)*l2*(1./(2.*sqrt(
     $strain(i,j)**2+0.25d0*(tension(i,j)**2+tension(i,j-1)**2+tension(
     $i-1,j)**2+tension(i-1,j-1)**2))))
              adstrain(i,j) = adstrain(i,j)+2*adviscah_zsmgh*strain(i,j)
              adtension(i-1,j-1) = adtension(i-1,j-1)+0.5d0*
     $adviscah_zsmgh*tension(i-1,j-1)
              adtension(i,j-1) = adtension(i,j-1)+0.5d0*adviscah_zsmgh*
     $tension(i,j-1)
              adtension(i-1,j) = adtension(i-1,j)+0.5d0*adviscah_zsmgh*
     $tension(i-1,j)
              adtension(i,j) = adtension(i,j)+0.5d0*adviscah_zsmgh*
     $tension(i,j)
              adviscah_zsmg(i,j) = 0.d0
            endif
            if (usefullleith .and. calcleith) then
              advisca4_zlthh = advisca4_zlth(i,j)*1./(2.*sqrt(leith4fac*
     $grdvrt+leithd4fac*grddiv))*l5
              adgrddiv = adgrddiv+advisca4_zlthh*leithd4fac
              adgrdvrt = adgrdvrt+advisca4_zlthh*leith4fac
              advisca4_zlth(i,j) = 0.d0
              adviscah_zlthh = adviscah_zlth(i,j)*1./(2.*sqrt(leith2fac*
     $grdvrt+leithd2fac*grddiv))*l3
              adgrddiv = adgrddiv+adviscah_zlthh*leithd2fac
              adgrdvrt = adgrdvrt+adviscah_zlthh*leith2fac
              adviscah_zlth(i,j) = 0.d0
              addivdx(i,j-1) = addivdx(i,j-1)+0.5d0*adgrddiv*divdx(i,j-
     $1)
              addivdx(i,j) = addivdx(i,j)+0.5d0*adgrddiv*divdx(i,j)
              addivdy(i-1,j) = addivdy(i-1,j)+0.5d0*adgrddiv*divdy(i-1,
     $j)
              addivdy(i,j) = addivdy(i,j)+0.5d0*adgrddiv*divdy(i,j)
              adgrddiv = 0.d0
              advrtdx(i-1,j) = advrtdx(i-1,j)+0.5d0*adgrdvrt*vrtdx(i-1,
     $j)
              advrtdx(i,j) = advrtdx(i,j)+0.5d0*adgrdvrt*vrtdx(i,j)
              advrtdy(i,j-1) = advrtdy(i,j-1)+0.5d0*adgrdvrt*vrtdy(i,j-
     $1)
              advrtdy(i,j) = advrtdy(i,j)+0.5d0*adgrdvrt*vrtdy(i,j)
              adgrdvrt = 0.d0
            else if (calcleith) then
              grdvrt = max(abs(vrtdx(i-1,j)),abs(vrtdx(i,j)))
              grdvrt = max(grdvrt,abs(vrtdy(i,j-1)))
              grddiv = max(abs(divdx(i,j)),abs(divdx(i,j-1)))
              grddiv = max(grddiv,abs(divdy(i,j)))
              adgrddiv = adgrddiv+advisca4_zlth(i,j)*leithd4fac*l5
              adgrdvrt = adgrdvrt+advisca4_zlth(i,j)*leith4fac*l5
              advisca4_zlth(i,j) = 0.d0
              adgrddiv = adgrddiv+adviscah_zlth(i,j)*leithd2fac*l3
              adgrdvrt = adgrdvrt+adviscah_zlth(i,j)*leith2fac*l3
              adviscah_zlth(i,j) = 0.d0
              grddivh = abs(divdy(i-1,j))
              adgrddivh = adgrddiv*(0.5-sign(0.5d0,grddiv-grddivh))
              adgrddiv = adgrddiv*(0.5+sign(0.5d0,grddiv-grddivh))
              addivdy(i-1,j) = addivdy(i-1,j)+adgrddivh*sign(1.d0,divdy(
     $i-1,j))
              grddiv = max(abs(divdx(i,j)),abs(divdx(i,j-1)))
              grddivi = abs(divdy(i,j))
              adgrddivi = adgrddiv*(0.5-sign(0.5d0,grddiv-grddivi))
              adgrddiv = adgrddiv*(0.5+sign(0.5d0,grddiv-grddivi))
              addivdy(i,j) = addivdy(i,j)+adgrddivi*sign(1.d0,divdy(i,j)
     $)
              grddivj = abs(divdx(i,j))
              grddivk = abs(divdx(i,j-1))
              adgrddivj = adgrddiv*(0.5+sign(0.5d0,grddivj-grddivk))
              adgrddivk = adgrddiv*(0.5-sign(0.5d0,grddivj-grddivk))
              addivdx(i,j-1) = addivdx(i,j-1)+adgrddivk*sign(1.d0,divdx(
     $i,j-1))
              addivdx(i,j) = addivdx(i,j)+adgrddivj*sign(1.d0,divdx(i,j)
     $)
              adgrddiv = 0.d0
              grdvrth = abs(vrtdy(i,j))
              adgrdvrth = adgrdvrt*(0.5-sign(0.5d0,grdvrt-grdvrth))
              adgrdvrt = adgrdvrt*(0.5+sign(0.5d0,grdvrt-grdvrth))
              advrtdy(i,j) = advrtdy(i,j)+adgrdvrth*sign(1.d0,vrtdy(i,j)
     $)
              grdvrt = max(abs(vrtdx(i-1,j)),abs(vrtdx(i,j)))
              grdvrti = abs(vrtdy(i,j-1))
              adgrdvrti = adgrdvrt*(0.5-sign(0.5d0,grdvrt-grdvrti))
              adgrdvrt = adgrdvrt*(0.5+sign(0.5d0,grdvrt-grdvrti))
              advrtdy(i,j-1) = advrtdy(i,j-1)+adgrdvrti*sign(1.d0,vrtdy(
     $i,j-1))
              grdvrtj = abs(vrtdx(i-1,j))
              grdvrtk = abs(vrtdx(i,j))
              adgrdvrtj = adgrdvrt*(0.5+sign(0.5d0,grdvrtj-grdvrtk))
              adgrdvrtk = adgrdvrt*(0.5-sign(0.5d0,grdvrtj-grdvrtk))
              advrtdx(i,j) = advrtdx(i,j)+adgrdvrtk*sign(1.d0,vrtdx(i,j)
     $)
              advrtdx(i-1,j) = advrtdx(i-1,j)+adgrdvrtj*sign(1.d0,vrtdx(
     $i-1,j))
              adgrdvrt = 0.d0
            else
              advisca4_zlth(i,j) = 0.d0
              adviscah_zlth(i,j) = 0.d0
            endif
            if (viscahre_max .gt. 0. .or. visca4re_max .gt. 0.) then
              if (kezpt .gt. 0.) then
                adkezpt = adkezpt+adu4scl*1./(2.*sqrt(kezpt))*l3*
     $visca4re_max
                adu4scl = 0.d0
                adkezpt = adkezpt+aduscl*1./(2.*sqrt(kezpt*l2))*
     $viscahre_max*l2
                aduscl = 0.d0
              else
                adu4scl = 0.d0
                aduscl = 0.d0
              endif
              adke(i-1,j-1) = adke(i-1,j-1)+0.25d0*adkezpt
              adke(i,j-1) = adke(i,j-1)+0.25d0*adkezpt
              adke(i-1,j) = adke(i-1,j)+0.25d0*adkezpt
              adke(i,j) = adke(i,j)+0.25d0*adkezpt
              adkezpt = 0.d0
            else
              adu4scl = 0.d0
              aduscl = 0.d0
            endif
            advisca4_d(i,j) = advisca4_d(i,j)*(0.5-sign(0.5d0,visca4_d(
     $i,j)-visca4_dmax(i,j)))
            l4rdt = l4rdt_d(i,j,bi,bj)
            alin = visca4d+visca4grid*l4rdt+visca4_dlth(i,j)+
     $visca4_dsmg(i,j)
            adalin = adalin+advisca4_d(i,j)*(0.5-sign(0.5d0,visca4_dmin(
     $i,j)-alin))
            advisca4_dmin(i,j) = advisca4_dmin(i,j)+advisca4_d(i,j)*(
     $0.5+sign(0.5d0,visca4_dmin(i,j)-alin))
            advisca4_d(i,j) = 0.d0
            l3 = l3_d(i,j,bi,bj)
            l4rdt = l4rdt_d(i,j,bi,bj)
            if (visca4re_max .gt. 0. .and. ke(i,j) .gt. 0.) then
              u4scl = sqrt(ke(i,j))*l3*visca4re_max
            else
              u4scl = 0.
            endif
            adu4scl = adu4scl+advisca4_dmin(i,j)*(0.5-sign(0.5d0,
     $visca4gridmin*l4rdt-u4scl))
            advisca4_dmin(i,j) = 0.d0
            advisca4_dlth(i,j) = advisca4_dlth(i,j)+adalin
            advisca4_dsmg(i,j) = advisca4_dsmg(i,j)+adalin
            adalin = 0.d0
            adviscah_d(i,j) = adviscah_d(i,j)*(0.5-sign(0.5d0,viscah_d(
     $i,j)-viscah_dmax(i,j)))
            l2 = l2_d(i,j,bi,bj)
            l2rdt = 0.25d0*recip_dt*l2
            alin = viscahd+viscahgrid*l2rdt+viscah_dlth(i,j)+
     $viscah_dsmg(i,j)
            adalin = adalin+adviscah_d(i,j)*(0.5-sign(0.5d0,viscah_dmin(
     $i,j)-alin))
            adviscah_dmin(i,j) = adviscah_dmin(i,j)+adviscah_d(i,j)*(
     $0.5+sign(0.5d0,viscah_dmin(i,j)-alin))
            adviscah_d(i,j) = 0.d0
            l2 = l2_d(i,j,bi,bj)
            l2rdt = 0.25d0*recip_dt*l2
            if (viscahre_max .gt. 0. .and. ke(i,j) .gt. 0.) then
              uscl = sqrt(ke(i,j)*l2)*viscahre_max
            else
              uscl = 0.
            endif
            aduscl = aduscl+adviscah_dmin(i,j)*(0.5-sign(0.5d0,
     $viscahgridmin*l2rdt-uscl))
            adviscah_dmin(i,j) = 0.d0
            adviscah_dlth(i,j) = adviscah_dlth(i,j)+adalin
            adviscah_dsmg(i,j) = adviscah_dsmg(i,j)+adalin
            adalin = 0.d0
            l2 = l2_d(i,j,bi,bj)
            if (calcsmag) then
              adviscah_dsmg(i,j) = adviscah_dsmg(i,j)*smag2fac
              adviscah_dsmg(i,j) = adviscah_dsmg(i,j)+advisca4_dsmg(i,j)
     $*smag4fac*l2
              advisca4_dsmg(i,j) = 0.d0
              adviscah_dsmgh = adviscah_dsmg(i,j)*l2*(1./(2.*sqrt(
     $tension(i,j)**2+0.25d0*(strain(i+1,j)**2+strain(i,j+1)**2+strain(
     $i,j)**2+strain(i+1,j+1)**2))))
              adstrain(i+1,j+1) = adstrain(i+1,j+1)+0.5d0*
     $adviscah_dsmgh*strain(i+1,j+1)
              adstrain(i,j+1) = adstrain(i,j+1)+0.5d0*adviscah_dsmgh*
     $strain(i,j+1)
              adstrain(i+1,j) = adstrain(i+1,j)+0.5d0*adviscah_dsmgh*
     $strain(i+1,j)
              adstrain(i,j) = adstrain(i,j)+0.5d0*adviscah_dsmgh*strain(
     $i,j)
              adtension(i,j) = adtension(i,j)+2*adviscah_dsmgh*tension(
     $i,j)
              adviscah_dsmg(i,j) = 0.d0
            else
              advisca4_dsmg(i,j) = 0.d0
              adviscah_dsmg(i,j) = 0.d0
            endif
            l2 = l2_d(i,j,bi,bj)
            l3 = l3_d(i,j,bi,bj)
            l5 = l2*l3
            if (usefullleith .and. calcleith) then
              grdvrt = 0.25d0*(vrtdx(i,j+1)*vrtdx(i,j+1)+vrtdx(i,j)*
     $vrtdx(i,j)+vrtdy(i+1,j)*vrtdy(i+1,j)+vrtdy(i,j)*vrtdy(i,j))
              grddiv = 0.25d0*(divdx(i+1,j)*divdx(i+1,j)+divdx(i,j)*
     $divdx(i,j)+divdy(i,j+1)*divdy(i,j+1)+divdy(i,j)*divdy(i,j))
              advisca4_dlthh = advisca4_dlth(i,j)*1./(2.*sqrt(leith4fac*
     $grdvrt+leithd4fac*grddiv))*l5
              adgrddiv = adgrddiv+advisca4_dlthh*leithd4fac
              adgrdvrt = adgrdvrt+advisca4_dlthh*leith4fac
              advisca4_dlth(i,j) = 0.d0
              adviscah_dlthh = adviscah_dlth(i,j)*1./(2.*sqrt(leith2fac*
     $grdvrt+leithd2fac*grddiv))*l3
              adgrddiv = adgrddiv+adviscah_dlthh*leithd2fac
              adgrdvrt = adgrdvrt+adviscah_dlthh*leith2fac
              adviscah_dlth(i,j) = 0.d0
              addivdx(i+1,j) = addivdx(i+1,j)+0.5d0*adgrddiv*divdx(i+1,
     $j)
              addivdx(i,j) = addivdx(i,j)+0.5d0*adgrddiv*divdx(i,j)
              addivdy(i,j+1) = addivdy(i,j+1)+0.5d0*adgrddiv*divdy(i,j+
     $1)
              addivdy(i,j) = addivdy(i,j)+0.5d0*adgrddiv*divdy(i,j)
              adgrddiv = 0.d0
              advrtdx(i,j+1) = advrtdx(i,j+1)+0.5d0*adgrdvrt*vrtdx(i,j+
     $1)
              advrtdx(i,j) = advrtdx(i,j)+0.5d0*adgrdvrt*vrtdx(i,j)
              advrtdy(i+1,j) = advrtdy(i+1,j)+0.5d0*adgrdvrt*vrtdy(i+1,
     $j)
              advrtdy(i,j) = advrtdy(i,j)+0.5d0*adgrdvrt*vrtdy(i,j)
              adgrdvrt = 0.d0
            else if (calcleith) then
              grdvrt = max(abs(vrtdx(i,j+1)),abs(vrtdx(i,j)))
              grdvrt = max(grdvrt,abs(vrtdy(i+1,j)))
              grddiv = max(abs(divdx(i+1,j)),abs(divdx(i,j)))
              grddiv = max(grddiv,abs(divdy(i,j+1)))
              adgrddiv = adgrddiv+advisca4_dlth(i,j)*leithd4fac*l5
              adgrdvrt = adgrdvrt+advisca4_dlth(i,j)*leith4fac*l5
              advisca4_dlth(i,j) = 0.d0
              adgrddiv = adgrddiv+adviscah_dlth(i,j)*leithd2fac*l3
              adgrdvrt = adgrdvrt+adviscah_dlth(i,j)*leith2fac*l3
              adviscah_dlth(i,j) = 0.d0
              grddivl = abs(divdy(i,j))
              adgrddivl = adgrddiv*(0.5-sign(0.5d0,grddiv-grddivl))
              adgrddiv = adgrddiv*(0.5+sign(0.5d0,grddiv-grddivl))
              addivdy(i,j) = addivdy(i,j)+adgrddivl*sign(1.d0,divdy(i,j)
     $)
              grddiv = max(abs(divdx(i+1,j)),abs(divdx(i,j)))
              grddivm = abs(divdy(i,j+1))
              adgrddivm = adgrddiv*(0.5-sign(0.5d0,grddiv-grddivm))
              adgrddiv = adgrddiv*(0.5+sign(0.5d0,grddiv-grddivm))
              addivdy(i,j+1) = addivdy(i,j+1)+adgrddivm*sign(1.d0,divdy(
     $i,j+1))
              grddivn = abs(divdx(i+1,j))
              grddivo = abs(divdx(i,j))
              adgrddivn = adgrddiv*(0.5+sign(0.5d0,grddivn-grddivo))
              adgrddivo = adgrddiv*(0.5-sign(0.5d0,grddivn-grddivo))
              addivdx(i,j) = addivdx(i,j)+adgrddivo*sign(1.d0,divdx(i,j)
     $)
              addivdx(i+1,j) = addivdx(i+1,j)+adgrddivn*sign(1.d0,divdx(
     $i+1,j))
              adgrddiv = 0.d0
              grdvrtl = abs(vrtdy(i,j))
              adgrdvrtl = adgrdvrt*(0.5-sign(0.5d0,grdvrt-grdvrtl))
              adgrdvrt = adgrdvrt*(0.5+sign(0.5d0,grdvrt-grdvrtl))
              advrtdy(i,j) = advrtdy(i,j)+adgrdvrtl*sign(1.d0,vrtdy(i,j)
     $)
              grdvrt = max(abs(vrtdx(i,j+1)),abs(vrtdx(i,j)))
              grdvrtm = abs(vrtdy(i+1,j))
              adgrdvrtm = adgrdvrt*(0.5-sign(0.5d0,grdvrt-grdvrtm))
              adgrdvrt = adgrdvrt*(0.5+sign(0.5d0,grdvrt-grdvrtm))
              advrtdy(i+1,j) = advrtdy(i+1,j)+adgrdvrtm*sign(1.d0,vrtdy(
     $i+1,j))
              grdvrtn = abs(vrtdx(i,j+1))
              grdvrto = abs(vrtdx(i,j))
              adgrdvrtn = adgrdvrt*(0.5+sign(0.5d0,grdvrtn-grdvrto))
              adgrdvrto = adgrdvrt*(0.5-sign(0.5d0,grdvrtn-grdvrto))
              advrtdx(i,j) = advrtdx(i,j)+adgrdvrto*sign(1.d0,vrtdx(i,j)
     $)
              advrtdx(i,j+1) = advrtdx(i,j+1)+adgrdvrtn*sign(1.d0,vrtdx(
     $i,j+1))
              adgrdvrt = 0.d0
            else
              advisca4_dlth(i,j) = 0.d0
              adviscah_dlth(i,j) = 0.d0
            endif
            l3 = l3_d(i,j,bi,bj)
            if (visca4re_max .gt. 0. .and. ke(i,j) .gt. 0.) then
              adke(i,j) = adke(i,j)+adu4scl*1./(2.*sqrt(ke(i,j)))*l3*
     $visca4re_max
              adu4scl = 0.d0
            else
              adu4scl = 0.d0
            endif
            l2 = l2_d(i,j,bi,bj)
            if (viscahre_max .gt. 0. .and. ke(i,j) .gt. 0.) then
              adke(i,j) = adke(i,j)+aduscl*1./(2.*sqrt(ke(i,j)*l2))*
     $viscahre_max*l2
              aduscl = 0.d0
            else
              aduscl = 0.d0
            endif
          end do
        end do
        if (calcleith) then
          do j = 2-oly, sny+oly-1
            do i = 2-olx, snx+olx
              advort3(i,j+1) = advort3(i,j+1)+advrtdy(i,j)*recip_dyg(i,
     $j,bi,bj)*maskw(i,j,k,bi,bj)
              advort3(i,j) = advort3(i,j)-advrtdy(i,j)*recip_dyg(i,j,bi,
     $bj)*maskw(i,j,k,bi,bj)
              advrtdy(i,j) = 0.d0
            end do
          end do
          do j = 2-oly, sny+oly
            do i = 2-olx, snx+olx-1
              advort3(i+1,j) = advort3(i+1,j)+advrtdx(i,j)*recip_dxg(i,
     $j,bi,bj)*masks(i,j,k,bi,bj)
              advort3(i,j) = advort3(i,j)-advrtdx(i,j)*recip_dxg(i,j,bi,
     $bj)*masks(i,j,k,bi,bj)
              advrtdx(i,j) = 0.d0
            end do
          end do
          do j = 2-oly, sny+oly-1
            do i = 2-olx, snx+olx-1
              adhdiv(i,j-1) = adhdiv(i,j-1)-addivdy(i,j)*recip_dyc(i,j,
     $bi,bj)
              adhdiv(i,j) = adhdiv(i,j)+addivdy(i,j)*recip_dyc(i,j,bi,
     $bj)
              addivdy(i,j) = 0.d0
            end do
          end do
          if (usecubedsphereexchange) then
            call adfill_cs_corner_tr_rl( 2, .false. ,adhdiv )
          endif
          do j = 2-oly, sny+oly-1
            do i = 2-olx, snx+olx-1
              adhdiv(i-1,j) = adhdiv(i-1,j)-addivdx(i,j)*recip_dxc(i,j,
     $bi,bj)
              adhdiv(i,j) = adhdiv(i,j)+addivdx(i,j)*recip_dxc(i,j,bi,
     $bj)
              addivdx(i,j) = 0.d0
            end do
          end do
          if (usecubedsphereexchange) then
            call adfill_cs_corner_tr_rl( 1, .false. ,adhdiv )
          endif
        endif
      endif

      end

      subroutine mdmom_calc_visc( bi, bj, k, viscah_z, viscah_d, 
     $visca4_z, visca4_d, harmonic, biharmonic, usevariableviscosity, 
     $hdiv, vort3, tension, strain, ke, hfacz, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision pi
      parameter ( pi = 3.1415926535898d0 )

C==============================================
C declare common blocks
C==============================================
      real*8 comlev1_mom_ijk_loop_visca4_zsm(2116800)
      common /cadvisca4_zsmg/ comlev1_mom_ijk_loop_visca4_zsm

      real*8 comlev1_mom_ijk_loop_viscah_zsm(2116800)
      common /cadviscah_zsmg/ comlev1_mom_ijk_loop_viscah_zsm

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision l2_d(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision l2_z(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision l3_d(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision l3_z(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision l4rdt_d(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision l4rdt_z(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dt
      common /mom_visc_l/ l2_d, l2_z, l3_d, l3_z, l4rdt_d, l4rdt_z, 
     $recip_dt

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

      integer ikey
      integer key
      common /tamckeys/ key, ikey

C==============================================
C declare arguments
C==============================================
      integer bi
      logical biharmonic
      integer bj
      logical harmonic
      double precision hdiv(1-olx:snx+olx,1-oly:sny+oly)
      double precision hfacz(1-olx:snx+olx,1-oly:sny+oly)
      integer k
      double precision ke(1-olx:snx+olx,1-oly:sny+oly)
      integer mythid
      double precision strain(1-olx:snx+olx,1-oly:sny+oly)
      double precision tension(1-olx:snx+olx,1-oly:sny+oly)
      logical usevariableviscosity
      double precision visca4_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision vort3(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer act1
      integer act2
      integer act3
      integer act4
      double precision alin
      logical calcleith
      logical calcsmag
      double precision divdx(1-olx:snx+olx,1-oly:sny+oly)
      double precision divdy(1-olx:snx+olx,1-oly:sny+oly)
      double precision grddiv
      double precision grdvrt
      integer i
      integer j
      double precision kezpt
      double precision l2
      double precision l2rdt
      double precision l3
      double precision l4rdt
      double precision l5
      double precision leith2fac
      double precision leith4fac
      double precision leithd2fac
      double precision leithd4fac
      integer lockey_1
      integer lockey_2
      integer max1
      integer max2
      integer max3
      double precision smag2fac
      double precision smag4fac
      double precision u4scl
      double precision uscl
      double precision visca4_dlth(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_dmax(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_dmin(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_dsmg(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_zlth(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_zmax(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_zmin(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_zsmg(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4re_max
      double precision viscah_dlth(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_dmax(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_dmin(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_dsmg(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_zlth(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_zmax(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_zmin(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_zsmg(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscahre_max
      double precision vrtdx(1-olx:snx+olx,1-oly:sny+oly)
      double precision vrtdy(1-olx:snx+olx,1-oly:sny+oly)

C**********************************************
C executable statements of routine
C**********************************************
      act1 = bi-mybxlo(mythid)
      max1 = mybxhi(mythid)-mybxlo(mythid)+1
      act2 = bj-mybylo(mythid)
      max2 = mybyhi(mythid)-mybylo(mythid)+1
      act3 = mythid-1
      max3 = ntx*nty
      act4 = ikey_dynamics-1
      ikey = act1+1+act2*max1+act3*max1*max2+act4*max1*max2*max3
      lockey_1 = (ikey-1)*nr+k
      usevariableviscosity = viscahgrid .ne. 0. .or. visca4grid .ne. 0. 
     $.or. viscc2leith .ne. 0. .or. viscc2leithd .ne. 0. .or. 
     $viscc4leith .ne. 0. .or. viscc4leithd .ne. 0. .or. viscc2smag 
     $.ne. 0. .or. viscc4smag .ne. 0.
      harmonic = viscah .ne. 0. .or. viscahd .ne. 0. .or. viscahz .ne. 
     $0. .or. viscahgrid .ne. 0. .or. viscc2leith .ne. 0. .or. 
     $viscc2leithd .ne. 0. .or. viscc2smag .ne. 0.
      biharmonic = visca4 .ne. 0. .or. visca4d .ne. 0. .or. visca4z 
     $.ne. 0. .or. visca4grid .ne. 0. .or. viscc4leith .ne. 0. .or. 
     $viscc4leithd .ne. 0. .or. viscc4smag .ne. 0.
      if (usevariableviscosity) then
        if (harmonic .and. viscahremax .ne. 0.) then
          viscahre_max = sqrt(2.d0)/viscahremax
        else
          viscahre_max = 0.d0
        endif
        if (biharmonic .and. visca4remax .ne. 0.) then
          visca4re_max = 0.125d0*sqrt(2.d0)/visca4remax
        else
          visca4re_max = 0.d0
        endif
        calcleith = viscc2leith .ne. 0. .or. viscc2leithd .ne. 0. .or. 
     $viscc4leith .ne. 0. .or. viscc4leithd .ne. 0.
        calcsmag = viscc2smag .ne. 0. .or. viscc4smag .ne. 0.
        if (calcsmag) then
          smag2fac = (viscc2smag/pi)**2
          smag4fac = 0.125d0*(viscc4smag/pi)**2
        else
          smag2fac = 0.d0
          smag4fac = 0.d0
        endif
        if (calcleith) then
          if (usefullleith) then
            leith2fac = (viscc2leith/pi)**6
            leithd2fac = (viscc2leithd/pi)**6
            leith4fac = 0.015625d0*(viscc4leith/pi)**6
            leithd4fac = 0.015625d0*(viscc4leithd/pi)**6
          else
            leith2fac = (viscc2leith/pi)**3
            leithd2fac = (viscc2leithd/pi)**3
            leith4fac = 0.125d0*(viscc4leith/pi)**3
            leithd4fac = 0.125d0*(viscc4leithd/pi)**3
          endif
        else
          leith2fac = 0.d0
          leith4fac = 0.d0
          leithd2fac = 0.d0
          leithd4fac = 0.d0
        endif
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            viscah_d(i,j) = viscahd
            viscah_z(i,j) = viscahz
            visca4_d(i,j) = visca4d
            visca4_z(i,j) = visca4z
            visca4_zsmg(i,j) = 0.d0
            viscah_zsmg(i,j) = 0.d0
            viscah_dlth(i,j) = 0.d0
            visca4_dlth(i,j) = 0.d0
            viscah_dsmg(i,j) = 0.d0
            visca4_dsmg(i,j) = 0.d0
            viscah_zlth(i,j) = 0.d0
            visca4_zlth(i,j) = 0.d0
          end do
        end do
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            divdx(i,j) = 0.
            divdy(i,j) = 0.
            vrtdx(i,j) = 0.
            vrtdy(i,j) = 0.
          end do
        end do
        if (calcleith) then
          if (usecubedsphereexchange) then
            call fill_cs_corner_tr_rl( 1, .false. ,hdiv,bi,bj,mythid )
          endif
          do j = 2-oly, sny+oly-1
            do i = 2-olx, snx+olx-1
              divdx(i,j) = (hdiv(i,j)-hdiv(i-1,j))*recip_dxc(i,j,bi,bj)
            end do
          end do
          if (usecubedsphereexchange) then
            call fill_cs_corner_tr_rl( 2, .false. ,hdiv,bi,bj,mythid )
          endif
          do j = 2-oly, sny+oly-1
            do i = 2-olx, snx+olx-1
              divdy(i,j) = (hdiv(i,j)-hdiv(i,j-1))*recip_dyc(i,j,bi,bj)
            end do
          end do
          do j = 2-oly, sny+oly
            do i = 2-olx, snx+olx-1
              vrtdx(i,j) = (vort3(i+1,j)-vort3(i,j))*recip_dxg(i,j,bi,
     $bj)*masks(i,j,k,bi,bj)
            end do
          end do
          do j = 2-oly, sny+oly-1
            do i = 2-olx, snx+olx
              vrtdy(i,j) = (vort3(i,j+1)-vort3(i,j))*recip_dyg(i,j,bi,
     $bj)*maskw(i,j,k,bi,bj)
            end do
          end do
        endif
        do j = 2-oly, sny+oly-1
          do i = 2-olx, snx+olx-1
            lockey_2 = i+olx+(snx+2*olx)*(j+oly-1)+(snx+2*olx)*(sny+2*
     $oly)*(lockey_1-1)
            comlev1_mom_ijk_loop_visca4_zsm(lockey_2) = visca4_zsmg(i,j)
            comlev1_mom_ijk_loop_viscah_zsm(lockey_2) = viscah_zsmg(i,j)
            l2 = l2_d(i,j,bi,bj)
            l2rdt = 0.25d0*recip_dt*l2
            l3 = l3_d(i,j,bi,bj)
            l4rdt = l4rdt_d(i,j,bi,bj)
            l5 = l2*l3
            if (viscahre_max .gt. 0. .and. ke(i,j) .gt. 0.) then
              uscl = sqrt(ke(i,j)*l2)*viscahre_max
            else
              uscl = 0.
            endif
            if (visca4re_max .gt. 0. .and. ke(i,j) .gt. 0.) then
              u4scl = sqrt(ke(i,j))*l3*visca4re_max
            else
              u4scl = 0.
            endif
            if (usefullleith .and. calcleith) then
              grdvrt = 0.25d0*(vrtdx(i,j+1)*vrtdx(i,j+1)+vrtdx(i,j)*
     $vrtdx(i,j)+vrtdy(i+1,j)*vrtdy(i+1,j)+vrtdy(i,j)*vrtdy(i,j))
              grddiv = 0.25d0*(divdx(i+1,j)*divdx(i+1,j)+divdx(i,j)*
     $divdx(i,j)+divdy(i,j+1)*divdy(i,j+1)+divdy(i,j)*divdy(i,j))
              viscah_dlth(i,j) = sqrt(leith2fac*grdvrt+leithd2fac*
     $grddiv)*l3
              visca4_dlth(i,j) = sqrt(leith4fac*grdvrt+leithd4fac*
     $grddiv)*l5
            else if (calcleith) then
              grdvrt = max(abs(vrtdx(i,j+1)),abs(vrtdx(i,j)))
              grdvrt = max(grdvrt,abs(vrtdy(i+1,j)))
              grdvrt = max(grdvrt,abs(vrtdy(i,j)))
              grddiv = max(abs(divdx(i+1,j)),abs(divdx(i,j)))
              grddiv = max(grddiv,abs(divdy(i,j+1)))
              grddiv = max(grddiv,abs(divdy(i,j)))
              viscah_dlth(i,j) = (leith2fac*grdvrt+leithd2fac*grddiv)*l3
              visca4_dlth(i,j) = (leith4fac*grdvrt+leithd4fac*grddiv)*l5
            else
              viscah_dlth(i,j) = 0.d0
              visca4_dlth(i,j) = 0.d0
            endif
            if (calcsmag) then
              viscah_dsmg(i,j) = l2*sqrt(tension(i,j)**2+0.25d0*(strain(
     $i+1,j)**2+strain(i,j+1)**2+strain(i,j)**2+strain(i+1,j+1)**2))
              visca4_dsmg(i,j) = smag4fac*l2*viscah_dsmg(i,j)
              viscah_dsmg(i,j) = smag2fac*viscah_dsmg(i,j)
            else
              viscah_dsmg(i,j) = 0.d0
              visca4_dsmg(i,j) = 0.d0
            endif
            alin = viscahd+viscahgrid*l2rdt+viscah_dlth(i,j)+
     $viscah_dsmg(i,j)
            viscah_dmin(i,j) = max(viscahgridmin*l2rdt,uscl)
            viscah_d(i,j) = max(viscah_dmin(i,j),alin)
            viscah_dmax(i,j) = min(viscahgridmax*l2rdt,viscahmax)
            viscah_d(i,j) = min(viscah_dmax(i,j),viscah_d(i,j))
            alin = visca4d+visca4grid*l4rdt+visca4_dlth(i,j)+
     $visca4_dsmg(i,j)
            visca4_dmin(i,j) = max(visca4gridmin*l4rdt,u4scl)
            visca4_d(i,j) = max(visca4_dmin(i,j),alin)
            visca4_dmax(i,j) = min(visca4gridmax*l4rdt,visca4max)
            visca4_d(i,j) = min(visca4_dmax(i,j),visca4_d(i,j))
            l2 = l2_z(i,j,bi,bj)
            l2rdt = 0.25d0*recip_dt*l2
            l3 = l3_z(i,j,bi,bj)
            l4rdt = l4rdt_z(i,j,bi,bj)
            l5 = l2*l3
            if (viscahre_max .gt. 0. .or. visca4re_max .gt. 0.) then
              kezpt = 0.25d0*(ke(i,j)+ke(i-1,j-1)+ke(i-1,j)+ke(i,j-1))
              if (kezpt .gt. 0.) then
                uscl = sqrt(kezpt*l2)*viscahre_max
                u4scl = sqrt(kezpt)*l3*visca4re_max
              else
                uscl = 0.
                u4scl = 0.
              endif
            else
              uscl = 0.
              u4scl = 0.
            endif
            if (usefullleith .and. calcleith) then
              grdvrt = 0.25d0*(vrtdx(i-1,j)*vrtdx(i-1,j)+vrtdx(i,j)*
     $vrtdx(i,j)+vrtdy(i,j-1)*vrtdy(i,j-1)+vrtdy(i,j)*vrtdy(i,j))
              grddiv = 0.25d0*(divdx(i,j-1)*divdx(i,j-1)+divdx(i,j)*
     $divdx(i,j)+divdy(i-1,j)*divdy(i-1,j)+divdy(i,j)*divdy(i,j))
              viscah_zlth(i,j) = sqrt(leith2fac*grdvrt+leithd2fac*
     $grddiv)*l3
              visca4_zlth(i,j) = sqrt(leith4fac*grdvrt+leithd4fac*
     $grddiv)*l5
            else if (calcleith) then
              grdvrt = max(abs(vrtdx(i-1,j)),abs(vrtdx(i,j)))
              grdvrt = max(grdvrt,abs(vrtdy(i,j-1)))
              grdvrt = max(grdvrt,abs(vrtdy(i,j)))
              grddiv = max(abs(divdx(i,j)),abs(divdx(i,j-1)))
              grddiv = max(grddiv,abs(divdy(i,j)))
              grddiv = max(grddiv,abs(divdy(i-1,j)))
              viscah_zlth(i,j) = (leith2fac*grdvrt+leithd2fac*grddiv)*l3
              visca4_zlth(i,j) = (leith4fac*grdvrt+leithd4fac*grddiv)*l5
            else
              viscah_zlth(i,j) = 0.d0
              visca4_zlth(i,j) = 0.d0
            endif
            if (calcsmag) then
              viscah_zsmg(i,j) = l2*sqrt(strain(i,j)**2+0.25d0*(tension(
     $i,j)**2+tension(i,j-1)**2+tension(i-1,j)**2+tension(i-1,j-1)**2))
              visca4_zsmg(i,j) = smag4fac*l2*viscah_zsmg(i,j)
              viscah_zsmg(i,j) = smag2fac*viscah_zsmg(i,j)
            endif
            alin = viscahz+viscahgrid*l2rdt+viscah_zlth(i,j)+
     $viscah_zsmg(i,j)
            viscah_zmin(i,j) = max(viscahgridmin*l2rdt,uscl)
            viscah_z(i,j) = max(viscah_zmin(i,j),alin)
            viscah_zmax(i,j) = min(viscahgridmax*l2rdt,viscahmax)
            viscah_z(i,j) = min(viscah_zmax(i,j),viscah_z(i,j))
            alin = visca4z+visca4grid*l4rdt+visca4_zlth(i,j)+
     $visca4_zsmg(i,j)
            visca4_zmin(i,j) = max(visca4gridmin*l4rdt,u4scl)
            visca4_z(i,j) = max(visca4_zmin(i,j),alin)
            visca4_zmax(i,j) = min(visca4gridmax*l4rdt,visca4max)
            visca4_z(i,j) = min(visca4_zmax(i,j),visca4_z(i,j))
          end do
        end do
      else
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            viscah_d(i,j) = viscahd
            viscah_z(i,j) = viscahz
            visca4_d(i,j) = visca4d
            visca4_z(i,j) = visca4z
          end do
        end do
      endif
      end

      subroutine admom_fluxform( bi, bj, imin, imax, jmin, jmax, k, kup,
     $ kdown, kapparu, kapparv, adfveru, adfverv, adgudiss, adgvdiss, 
     $mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adfveru(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision adfverv(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision adgudiss(1-olx:snx+olx,1-oly:sny+oly)
      double precision adgvdiss(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k
      double precision kapparu(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision kapparv(1-olx:snx+olx,1-oly:sny+oly,nr)
      integer kdown
      integer kup
      integer mythid

C==============================================
C declare local variables
C==============================================
      double precision adcf(1-olx:snx+olx,1-oly:sny+oly)
      double precision adfmer(1-olx:snx+olx,1-oly:sny+oly)
      double precision adfvrdw(1-olx:snx+olx,1-oly:sny+oly)
      double precision adfvrup(1-olx:snx+olx,1-oly:sny+oly)
      double precision adfzon(1-olx:snx+olx,1-oly:sny+oly)
      double precision adhdiv(1-olx:snx+olx,1-oly:sny+oly)
      double precision adke(1-olx:snx+olx,1-oly:sny+oly)
      double precision admt(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrtransu(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrtransv(1-olx:snx+olx,1-oly:sny+oly)
      double precision adstrain(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtension(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adv4f(1-olx:snx+olx,1-oly:sny+oly)
      double precision advf(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision advort3(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision ahdudxfac
      double precision ahdudyfac
      double precision ahdvdxfac
      double precision ahdvdyfac
      double precision ardudrfac
      double precision ardvdrfac
      logical biharmonic
      logical bottomdragterms
      double precision fufac
      double precision fvfac
      logical harmonic
      double precision hdiv(1-olx:snx+olx,1-oly:sny+oly)
      integer help_h
      integer help_i
      integer help_j
      integer help_k
      integer help_l
      double precision hfacz(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer ip1
      integer ip2
      integer j
      double precision ke(1-olx:snx+olx,1-oly:sny+oly)
      double precision mtfacu
      double precision mtfacv
      double precision mtnhfacu
      double precision mtnhfacv
      integer myiter
      double precision mytime
      double precision r_hfacz(1-olx:snx+olx,1-oly:sny+oly)
      double precision rtransu(1-olx:snx+olx,1-oly:sny+oly)
      double precision rtransv(1-olx:snx+olx,1-oly:sny+oly)
      double precision rveldudrfac
      double precision rveldvdrfac
      double precision sidemaskfac
      double precision strain(1-olx:snx+olx,1-oly:sny+oly)
      double precision tension(1-olx:snx+olx,1-oly:sny+oly)
      double precision ududxfac
      double precision udvdxfac
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      logical usevariableviscosity
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision v4f(1-olx:snx+olx,1-oly:sny+oly)
      double precision vdudyfac
      double precision vdvdyfac
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision vort3(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adcf(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adfmer(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adfvrdw(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adfvrup(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adfzon(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adhdiv(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adke(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          admt(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adrtransu(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adrtransv(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adstrain(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adtension(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adufld(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adutrans(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adv4f(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advf(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advfld(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advisca4_d(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advisca4_z(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adviscah_d(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adviscah_z(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advort3(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advtrans(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          v4f(i,j) = 0.
          rtransu(i,j) = 0.
          rtransv(i,j) = 0.
          hdiv(i,j) = 0.
          vort3(i,j) = 0.
          strain(i,j) = 0.
          tension(i,j) = 0.
        end do
      end do
      ududxfac = affacmom*1.
      ahdudxfac = vffacmom*1.
      vdudyfac = affacmom*1.
      ahdudyfac = vffacmom*1.
      rveldudrfac = affacmom*1.
      ardudrfac = vffacmom*1.
      mtfacu = mtfacmom*1.
      mtnhfacu = 1.
      fufac = cffacmom*1.
      udvdxfac = affacmom*1.
      ahdvdxfac = vffacmom*1.
      vdvdyfac = affacmom*1.
      ahdvdyfac = vffacmom*1.
      rveldvdrfac = affacmom*1.
      ardvdrfac = vffacmom*1.
      mtfacv = mtfacmom*1.
      mtnhfacv = 1.
      fvfac = cffacmom*1.
      if (implicitviscosity) then
        ardudrfac = 0.
        ardvdrfac = 0.
      endif
      if (no_slip_sides) then
        sidemaskfac = sidedragfactor
      else
        sidemaskfac = 0.d0
      endif
      if (no_slip_bottom .or. bottomdragquadratic .ne. 0. .or. 
     $bottomdraglinear .ne. 0.) then
        bottomdragterms =  .true. 
      else
        bottomdragterms =  .false. 
      endif
      call mom_calc_hfacz( bi,bj,k,hfacz,r_hfacz,mythid )
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          xa(i,j) = dyg(i,j,bi,bj)*deepfacc(k)*drf(k)*hfacw(i,j,k,bi,bj)
          ya(i,j) = dxg(i,j,bi,bj)*deepfacc(k)*drf(k)*hfacs(i,j,k,bi,bj)
        end do
      end do
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          ufld(i,j) = uvel(i,j,k,bi,bj)
          vfld(i,j) = vvel(i,j,k,bi,bj)
        end do
      end do
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          utrans(i,j) = ufld(i,j)*xa(i,j)*rhofacc(k)
          vtrans(i,j) = vfld(i,j)*ya(i,j)*rhofacc(k)
        end do
      end do
      call mom_calc_ke( bi,bj,k,2,ufld,vfld,ke,mythid )
      if (momviscosity) then
        call mom_calc_hdiv( bi,bj,k,2,ufld,vfld,hdiv,mythid )
        call mom_calc_relvort3( bi,bj,k,ufld,vfld,hfacz,vort3,mythid )
        call mom_calc_tension( bi,bj,k,ufld,vfld,tension,mythid )
        call mom_calc_strain( bi,bj,k,ufld,vfld,hfacz,strain,mythid )
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            if (hfacz(i,j) .eq. 0.) then
              vort3(i,j) = sidemaskfac*vort3(i,j)
              strain(i,j) = sidemaskfac*strain(i,j)
            endif
          end do
        end do
      endif
      if (momadvection .and. k .eq. 1) then
        call mom_calc_rtrans( k,bi,bj,rtransu,rtransv,mytime,myiter,
     $mythid )
      endif
      if (momadvection) then
        help_h = k+1
        call mom_calc_rtrans( help_h,bi,bj,rtransu,rtransv,mytime,
     $myiter,mythid )
      endif
      if (momviscosity) then
        call mom_calc_visc( bi,bj,k,viscah_z,viscah_d,visca4_z,visca4_d,
     $harmonic,biharmonic,usevariableviscosity,hdiv,vort3,tension,
     $strain,ke,hfacz,mythid )
      endif
      if (momviscosity) then
        if (biharmonic) then
          call mom_u_del2u( bi,bj,k,ufld,hfacz,v4f,mythid )
        endif
      endif
      do j = jmin, jmax
        do i = imin, imax
          adgvdiss(i,j) = adgvdiss(i,j)*masks(i,j,k,bi,bj)
          adgv(i,j,k,bi,bj) = adgv(i,j,k,bi,bj)*masks(i,j,k,bi,bj)
          adgudiss(i,j) = adgudiss(i,j)*maskw(i,j,k,bi,bj)
          adgu(i,j,k,bi,bj) = adgu(i,j,k,bi,bj)*maskw(i,j,k,bi,bj)
        end do
      end do
      if (use3dcoriolis) then
        if (usingcurvilineargrid) then
          do j = jmin, jmax
            do i = imin, imax
              adcf(i,j) = adcf(i,j)+adgv(i,j,k,bi,bj)*fvfac
            end do
          end do
          call admom_v_coriolis_nh( bi,bj,k,adwvel,adcf )
        endif
        do j = jmin, jmax
          do i = imin, imax
            adcf(i,j) = adcf(i,j)+adgu(i,j,k,bi,bj)*fufac
          end do
        end do
        call admom_u_coriolis_nh( bi,bj,k,adwvel,adcf )
      endif
      if ( .not. usecdscheme) then
        do j = jmin, jmax
          do i = imin, imax
            adcf(i,j) = adcf(i,j)+adgv(i,j,k,bi,bj)*fvfac
          end do
        end do
        call admom_v_coriolis( bi,bj,k,adufld,adcf )
        do j = jmin, jmax
          do i = imin, imax
            adcf(i,j) = adcf(i,j)+adgu(i,j,k,bi,bj)*fufac
          end do
        end do
        call admom_u_coriolis( bi,bj,k,advfld,adcf )
      endif
      if (usingcylindricalgrid .and. metricterms) then
        do j = jmin, jmax
          do i = imin, imax
            admt(i,j) = admt(i,j)+adgv(i,j,k,bi,bj)*mtfacv
          end do
        end do
        call admom_v_metric_cylinder( bi,bj,ufld,adufld,admt )
      endif
      if (usingsphericalpolargrid .and. metricterms) then
        do j = jmin, jmax
          do i = imin, imax
            admt(i,j) = admt(i,j)+adgv(i,j,k,bi,bj)*mtfacv
          end do
        end do
        call admom_v_metric_sphere( bi,bj,k,ufld,adufld,admt )
      endif
      if (usenhmterms) then
        do j = jmin, jmax
          do i = imin, imax
            admt(i,j) = admt(i,j)+adgv(i,j,k,bi,bj)*mtnhfacv
          end do
        end do
        call admom_v_metric_nh( bi,bj,k,vfld,advfld,wvel,adwvel,admt )
      endif
      if (momviscosity) then
        if (biharmonic) then
          call mom_v_del2v( bi,bj,k,vfld,hfacz,v4f,mythid )
        endif
        if (bottomdragterms) then
          do j = jmin, jmax
            do i = imin, imax
              advf(i,j) = advf(i,j)+adgvdiss(i,j)
            end do
          end do
          call admom_v_bottomdrag( bi,bj,k,vfld,advfld,ke,adke,kapparv,
     $advf )
        endif
        if (no_slip_sides) then
          do j = jmin, jmax
            do i = imin, imax
              advf(i,j) = advf(i,j)+adgvdiss(i,j)
            end do
          end do
          call admom_v_sidedrag( bi,bj,k,vfld,advfld,v4f,adv4f,hfacz,
     $viscah_z,adviscah_z,visca4_z,advisca4_z,advf )
        endif
        do j = jmin, jmax
          do i = imin, imax
            adfmer(i,j-1) = adfmer(i,j-1)+adgvdiss(i,j)*recip_hfacs(i,j,
     $k,bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*recip_deepfac2c(k)*
     $ahdvdyfac
            adfmer(i,j) = adfmer(i,j)-adgvdiss(i,j)*recip_hfacs(i,j,k,
     $bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*recip_deepfac2c(k)*
     $ahdvdyfac
            adfvrdw(i,j) = adfvrdw(i,j)-adgvdiss(i,j)*recip_hfacs(i,j,k,
     $bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*recip_deepfac2c(k)*
     $rksign*ardvdrfac*recip_rhofacc(k)
            adfvrup(i,j) = adfvrup(i,j)+adgvdiss(i,j)*recip_hfacs(i,j,k,
     $bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*recip_deepfac2c(k)*
     $rksign*ardvdrfac*recip_rhofacc(k)
            adfzon(i+1,j) = adfzon(i+1,j)-adgvdiss(i,j)*recip_hfacs(i,j,
     $k,bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*recip_deepfac2c(k)*
     $ahdvdxfac
            adfzon(i,j) = adfzon(i,j)+adgvdiss(i,j)*recip_hfacs(i,j,k,
     $bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*recip_deepfac2c(k)*
     $ahdvdxfac
            adgvdiss(i,j) = 0.d0
          end do
        end do
        if ( .not. implicitviscosity) then
          help_l = k+1
          call admom_v_rviscflux( bi,bj,help_l,advvel,kapparv,adfvrdw )
          call admom_v_rviscflux( bi,bj,k,advvel,kapparv,adfvrup )
        endif
        call admom_v_yviscflux( bi,bj,k,vfld,advfld,v4f,adv4f,adfmer,
     $viscah_d,adviscah_d,visca4_d,advisca4_d )
        call admom_v_xviscflux( bi,bj,k,vfld,advfld,v4f,adv4f,hfacz,
     $adfzon,viscah_z,adviscah_z,visca4_z,advisca4_z )
        if (biharmonic) then
          call admom_v_del2v( bi,bj,k,advfld,hfacz,adv4f )
        endif
      endif
      if (momadvection) then
        help_k = k+1
        do j = jmin, jmax
          do i = imin, imax
            adfmer(i,j-1) = adfmer(i,j-1)+adgv(i,j,k,bi,bj)*recip_hfacs(
     $i,j,k,bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*recip_deepfac2c(k)*
     $recip_rhofacc(k)*vdvdyfac
            adfmer(i,j) = adfmer(i,j)-adgv(i,j,k,bi,bj)*recip_hfacs(i,j,
     $k,bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*recip_deepfac2c(k)*
     $recip_rhofacc(k)*vdvdyfac
            adfverv(i,j,kdown) = adfverv(i,j,kdown)-adgv(i,j,k,bi,bj)*
     $recip_hfacs(i,j,k,bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_rhofacc(k)*rksign*rveldvdrfac
            adfverv(i,j,kup) = adfverv(i,j,kup)+adgv(i,j,k,bi,bj)*
     $recip_hfacs(i,j,k,bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_rhofacc(k)*rksign*rveldvdrfac
            adfzon(i+1,j) = adfzon(i+1,j)-adgv(i,j,k,bi,bj)*recip_hfacs(
     $i,j,k,bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*recip_deepfac2c(k)*
     $recip_rhofacc(k)*udvdxfac
            adfzon(i,j) = adfzon(i,j)+adgv(i,j,k,bi,bj)*recip_hfacs(i,j,
     $k,bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*recip_deepfac2c(k)*
     $recip_rhofacc(k)*udvdxfac
            adgv(i,j,k,bi,bj) = 0.d0
          end do
        end do
        call admom_v_adv_wv( bi,bj,help_k,vvel,advvel,wvel,adwvel,
     $rtransv,adrtransv,adfverv(1-olx,1-oly,kdown) )
        call admom_v_adv_vv( vtrans,advtrans,vfld,advfld,adfmer )
        call admom_v_adv_uv( utrans,adutrans,vfld,advfld,adfzon )
      else
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adgv(i,j,k,bi,bj) = 0.d0
          end do
        end do
      endif
      if (usingcylindricalgrid .and. metricterms) then
        do j = jmin, jmax
          do i = imin, imax
            admt(i,j) = admt(i,j)+adgu(i,j,k,bi,bj)*mtfacu
          end do
        end do
        call admom_u_metric_cylinder( bi,bj,ufld,adufld,vfld,advfld,
     $admt )
      endif
      if (usingsphericalpolargrid .and. metricterms) then
        do j = jmin, jmax
          do i = imin, imax
            admt(i,j) = admt(i,j)+adgu(i,j,k,bi,bj)*mtfacu
          end do
        end do
        call admom_u_metric_sphere( bi,bj,k,ufld,adufld,vfld,advfld,
     $admt )
      endif
      if (usenhmterms) then
        do j = jmin, jmax
          do i = imin, imax
            admt(i,j) = admt(i,j)+adgu(i,j,k,bi,bj)*mtnhfacu
          end do
        end do
        call admom_u_metric_nh( bi,bj,k,ufld,adufld,wvel,adwvel,admt )
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          v4f(i,j) = 0.
        end do
      end do
      if (momviscosity) then
        if (biharmonic) then
          call mom_u_del2u( bi,bj,k,ufld,hfacz,v4f,mythid )
        endif
        if (bottomdragterms) then
          do j = jmin, jmax
            do i = imin, imax
              advf(i,j) = advf(i,j)+adgudiss(i,j)
            end do
          end do
          call admom_u_bottomdrag( bi,bj,k,ufld,adufld,ke,adke,kapparu,
     $advf )
        endif
        if (no_slip_sides) then
          do j = jmin, jmax
            do i = imin, imax
              advf(i,j) = advf(i,j)+adgudiss(i,j)
            end do
          end do
          call admom_u_sidedrag( bi,bj,k,ufld,adufld,v4f,adv4f,hfacz,
     $viscah_z,adviscah_z,visca4_z,advisca4_z,advf )
        endif
        do j = jmin, jmax
          do i = imin, imax
            adfmer(i,j+1) = adfmer(i,j+1)-adgudiss(i,j)*recip_hfacw(i,j,
     $k,bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*recip_deepfac2c(k)*
     $ahdudyfac
            adfmer(i,j) = adfmer(i,j)+adgudiss(i,j)*recip_hfacw(i,j,k,
     $bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*recip_deepfac2c(k)*
     $ahdudyfac
            adfvrdw(i,j) = adfvrdw(i,j)-adgudiss(i,j)*recip_hfacw(i,j,k,
     $bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*recip_deepfac2c(k)*
     $rksign*ardudrfac*recip_rhofacc(k)
            adfvrup(i,j) = adfvrup(i,j)+adgudiss(i,j)*recip_hfacw(i,j,k,
     $bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*recip_deepfac2c(k)*
     $rksign*ardudrfac*recip_rhofacc(k)
            adfzon(i-1,j) = adfzon(i-1,j)+adgudiss(i,j)*recip_hfacw(i,j,
     $k,bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*recip_deepfac2c(k)*
     $ahdudxfac
            adfzon(i,j) = adfzon(i,j)-adgudiss(i,j)*recip_hfacw(i,j,k,
     $bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*recip_deepfac2c(k)*
     $ahdudxfac
            adgudiss(i,j) = 0.d0
          end do
        end do
        if ( .not. implicitviscosity) then
          help_j = k+1
          call admom_u_rviscflux( bi,bj,help_j,aduvel,kapparu,adfvrdw )
          call admom_u_rviscflux( bi,bj,k,aduvel,kapparu,adfvrup )
        endif
        call admom_u_yviscflux( bi,bj,k,ufld,adufld,v4f,adv4f,hfacz,
     $adfmer,viscah_z,adviscah_z,visca4_z,advisca4_z )
        call admom_u_xviscflux( bi,bj,k,ufld,adufld,v4f,adv4f,adfzon,
     $viscah_d,adviscah_d,visca4_d,advisca4_d )
        if (biharmonic) then
          call admom_u_del2u( bi,bj,k,adufld,hfacz,adv4f )
        endif
      endif
      if (momadvection) then
        help_i = k+1
        do j = jmin, jmax
          do i = imin, imax
            adfmer(i,j+1) = adfmer(i,j+1)-adgu(i,j,k,bi,bj)*recip_hfacw(
     $i,j,k,bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*recip_deepfac2c(k)*
     $recip_rhofacc(k)*vdudyfac
            adfmer(i,j) = adfmer(i,j)+adgu(i,j,k,bi,bj)*recip_hfacw(i,j,
     $k,bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*recip_deepfac2c(k)*
     $recip_rhofacc(k)*vdudyfac
            adfveru(i,j,kdown) = adfveru(i,j,kdown)-adgu(i,j,k,bi,bj)*
     $recip_hfacw(i,j,k,bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_rhofacc(k)*rksign*rveldudrfac
            adfveru(i,j,kup) = adfveru(i,j,kup)+adgu(i,j,k,bi,bj)*
     $recip_hfacw(i,j,k,bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*
     $recip_deepfac2c(k)*recip_rhofacc(k)*rksign*rveldudrfac
            adfzon(i-1,j) = adfzon(i-1,j)+adgu(i,j,k,bi,bj)*recip_hfacw(
     $i,j,k,bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*recip_deepfac2c(k)*
     $recip_rhofacc(k)*ududxfac
            adfzon(i,j) = adfzon(i,j)-adgu(i,j,k,bi,bj)*recip_hfacw(i,j,
     $k,bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*recip_deepfac2c(k)*
     $recip_rhofacc(k)*ududxfac
            adgu(i,j,k,bi,bj) = 0.d0
          end do
        end do
        call admom_u_adv_wu( bi,bj,help_i,uvel,aduvel,wvel,adwvel,
     $rtransu,adrtransu,adfveru(1-olx,1-oly,kdown) )
        call admom_u_adv_vu( vtrans,advtrans,ufld,adufld,adfmer )
        call admom_u_adv_uu( utrans,adutrans,ufld,adufld,adfzon )
      else
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adgu(i,j,k,bi,bj) = 0.d0
          end do
        end do
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          hdiv(i,j) = 0.
        end do
      end do
      if (momviscosity) then
        call mom_calc_hdiv( bi,bj,k,2,ufld,vfld,hdiv,mythid )
      endif
      if (momviscosity) then
        call admom_calc_visc( bi,bj,k,adviscah_z,adviscah_d,advisca4_z,
     $advisca4_d,hdiv,adhdiv,vort3,advort3,tension,adtension,strain,
     $adstrain,ke,adke,mythid )
      endif
      if (momadvection) then
        call admom_calc_rtrans( help_h,bi,bj,adrtransu,adrtransv )
      endif
      if (momadvection .and. k .eq. 1) then
        call mom_calc_rtrans( k,bi,bj,rtransu,rtransv,mytime,myiter,
     $mythid )
        call admom_v_adv_wv( bi,bj,k,vvel,advvel,wvel,adwvel,rtransv,
     $adrtransv,adfverv(1-olx,1-oly,kup) )
        call admom_u_adv_wu( bi,bj,k,uvel,aduvel,wvel,adwvel,rtransu,
     $adrtransu,adfveru(1-olx,1-oly,kup) )
        call admom_calc_rtrans( k,bi,bj,adrtransu,adrtransv )
      endif
      if (momviscosity) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            if (hfacz(i,j) .eq. 0.) then
              adstrain(i,j) = adstrain(i,j)*sidemaskfac
              advort3(i,j) = advort3(i,j)*sidemaskfac
            endif
          end do
        end do
        call admom_calc_strain( bi,bj,adufld,advfld,adstrain )
        call admom_calc_tension( bi,bj,adufld,advfld,adtension )
        call admom_calc_relvort3( bi,bj,adufld,advfld,advort3 )
        call admom_calc_hdiv( bi,bj,k,2,adufld,advfld,adhdiv )
      endif
      call admom_calc_ke( bi,bj,k,2,ufld,adufld,vfld,advfld,adke )
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          advfld(i,j) = advfld(i,j)+advtrans(i,j)*ya(i,j)*rhofacc(k)
          advtrans(i,j) = 0.d0
          adufld(i,j) = adufld(i,j)+adutrans(i,j)*xa(i,j)*rhofacc(k)
          adutrans(i,j) = 0.d0
        end do
      end do
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          advvel(i,j,k,bi,bj) = advvel(i,j,k,bi,bj)+advfld(i,j)
          advfld(i,j) = 0.d0
          aduvel(i,j,k,bi,bj) = aduvel(i,j,k,bi,bj)+adufld(i,j)
          adufld(i,j) = 0.d0
        end do
      end do
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          adgvdiss(i,j) = 0.d0
          adgudiss(i,j) = 0.d0
        end do
      end do

      end

      subroutine mdmom_fluxform( bi, bj, imin, imax, jmin, jmax, k, kup,
     $ kdown, kapparu, kapparv, fveru, fverv, gudiss, gvdiss, mytime, 
     $myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      integer bi
      integer bj
      double precision fveru(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision fverv(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision gudiss(1-olx:snx+olx,1-oly:sny+oly)
      double precision gvdiss(1-olx:snx+olx,1-oly:sny+oly)
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k
      double precision kapparu(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision kapparv(1-olx:snx+olx,1-oly:sny+oly,nr)
      integer kdown
      integer kup
      integer myiter
      integer mythid
      double precision mytime

C==============================================
C declare local variables
C==============================================
      double precision ahdudxfac
      double precision ahdudyfac
      double precision ahdvdxfac
      double precision ahdvdyfac
      double precision ardudrfac
      double precision ardvdrfac
      logical biharmonic
      logical bottomdragterms
      double precision cf(1-olx:snx+olx,1-oly:sny+oly)
      double precision fmer(1-olx:snx+olx,1-oly:sny+oly)
      double precision fufac
      double precision fvfac
      double precision fvrdw(1-olx:snx+olx,1-oly:sny+oly)
      double precision fvrup(1-olx:snx+olx,1-oly:sny+oly)
      double precision fzon(1-olx:snx+olx,1-oly:sny+oly)
      logical harmonic
      double precision hdiv(1-olx:snx+olx,1-oly:sny+oly)
      integer help_h
      integer help_i
      integer help_j
      integer help_k
      integer help_l
      double precision hfacz(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer j
      double precision ke(1-olx:snx+olx,1-oly:sny+oly)
      double precision mt(1-olx:snx+olx,1-oly:sny+oly)
      double precision mtfacu
      double precision mtfacv
      double precision mtnhfacu
      double precision mtnhfacv
      double precision r_hfacz(1-olx:snx+olx,1-oly:sny+oly)
      double precision rtransu(1-olx:snx+olx,1-oly:sny+oly)
      double precision rtransv(1-olx:snx+olx,1-oly:sny+oly)
      double precision rveldudrfac
      double precision rveldvdrfac
      double precision sidemaskfac
      double precision strain(1-olx:snx+olx,1-oly:sny+oly)
      double precision tension(1-olx:snx+olx,1-oly:sny+oly)
      double precision ududxfac
      double precision udvdxfac
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      logical usevariableviscosity
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision v4f(1-olx:snx+olx,1-oly:sny+oly)
      double precision vdudyfac
      double precision vdvdyfac
      double precision vf(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision vort3(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C**********************************************
C executable statements of routine
C**********************************************
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          vf(i,j) = 0.
          v4f(i,j) = 0.
          cf(i,j) = 0.
          mt(i,j) = 0.
          fzon(i,j) = 0.
          fmer(i,j) = 0.
          fvrup(i,j) = 0.
          fvrdw(i,j) = 0.
          rtransu(i,j) = 0.
          rtransv(i,j) = 0.
          hdiv(i,j) = 0.
          vort3(i,j) = 0.
          strain(i,j) = 0.
          tension(i,j) = 0.
          gudiss(i,j) = 0.
          gvdiss(i,j) = 0.
        end do
      end do
      ududxfac = affacmom*1.
      ahdudxfac = vffacmom*1.
      vdudyfac = affacmom*1.
      ahdudyfac = vffacmom*1.
      rveldudrfac = affacmom*1.
      ardudrfac = vffacmom*1.
      mtfacu = mtfacmom*1.
      mtnhfacu = 1.
      fufac = cffacmom*1.
      udvdxfac = affacmom*1.
      ahdvdxfac = vffacmom*1.
      vdvdyfac = affacmom*1.
      ahdvdyfac = vffacmom*1.
      rveldvdrfac = affacmom*1.
      ardvdrfac = vffacmom*1.
      mtfacv = mtfacmom*1.
      mtnhfacv = 1.
      fvfac = cffacmom*1.
      if (implicitviscosity) then
        ardudrfac = 0.
        ardvdrfac = 0.
      endif
      if (no_slip_sides) then
        sidemaskfac = sidedragfactor
      else
        sidemaskfac = 0.d0
      endif
      if (no_slip_bottom .or. bottomdragquadratic .ne. 0. .or. 
     $bottomdraglinear .ne. 0.) then
        bottomdragterms =  .true. 
      else
        bottomdragterms =  .false. 
      endif
      call mom_calc_hfacz( bi,bj,k,hfacz,r_hfacz,mythid )
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          xa(i,j) = dyg(i,j,bi,bj)*deepfacc(k)*drf(k)*hfacw(i,j,k,bi,bj)
          ya(i,j) = dxg(i,j,bi,bj)*deepfacc(k)*drf(k)*hfacs(i,j,k,bi,bj)
        end do
      end do
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          ufld(i,j) = uvel(i,j,k,bi,bj)
          vfld(i,j) = vvel(i,j,k,bi,bj)
        end do
      end do
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          utrans(i,j) = ufld(i,j)*xa(i,j)*rhofacc(k)
          vtrans(i,j) = vfld(i,j)*ya(i,j)*rhofacc(k)
        end do
      end do
      call mom_calc_ke( bi,bj,k,2,ufld,vfld,ke,mythid )
      if (momviscosity) then
        call mom_calc_hdiv( bi,bj,k,2,ufld,vfld,hdiv,mythid )
        call mom_calc_relvort3( bi,bj,k,ufld,vfld,hfacz,vort3,mythid )
        call mom_calc_tension( bi,bj,k,ufld,vfld,tension,mythid )
        call mom_calc_strain( bi,bj,k,ufld,vfld,hfacz,strain,mythid )
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            if (hfacz(i,j) .eq. 0.) then
              vort3(i,j) = sidemaskfac*vort3(i,j)
              strain(i,j) = sidemaskfac*strain(i,j)
            endif
          end do
        end do
      endif
      if (momadvection .and. k .eq. 1) then
        call mom_calc_rtrans( k,bi,bj,rtransu,rtransv,mytime,myiter,
     $mythid )
        call mom_u_adv_wu( bi,bj,k,uvel,wvel,rtransu,fveru(1-olx,1-oly,
     $kup),mythid )
        call mom_v_adv_wv( bi,bj,k,vvel,wvel,rtransv,fverv(1-olx,1-oly,
     $kup),mythid )
      endif
      if (momadvection) then
        help_h = k+1
        call mom_calc_rtrans( help_h,bi,bj,rtransu,rtransv,mytime,
     $myiter,mythid )
      endif
      if (momviscosity) then
        call mdmom_calc_visc( bi,bj,k,viscah_z,viscah_d,visca4_z,
     $visca4_d,harmonic,biharmonic,usevariableviscosity,hdiv,vort3,
     $tension,strain,ke,hfacz,mythid )
      endif
      if (momadvection) then
        call mom_u_adv_uu( bi,bj,k,utrans,ufld,fzon,mythid )
        call mom_u_adv_vu( bi,bj,k,vtrans,ufld,fmer,mythid )
        help_i = k+1
        call mom_u_adv_wu( bi,bj,help_i,uvel,wvel,rtransu,fveru(1-olx,1-
     $oly,kdown),mythid )
        do j = jmin, jmax
          do i = imin, imax
            gu(i,j,k,bi,bj) = -(recip_hfacw(i,j,k,bi,bj)*recip_drf(k)*
     $recip_raw(i,j,bi,bj)*recip_deepfac2c(k)*recip_rhofacc(k)*((fzon(i,
     $j)-fzon(i-1,j))*ududxfac+(fmer(i,j+1)-fmer(i,j))*vdudyfac+(fveru(
     $i,j,kdown)-fveru(i,j,kup))*rksign*rveldudrfac))
          end do
        end do
      else
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            gu(i,j,k,bi,bj) = 0.d0
          end do
        end do
      endif
      if (momviscosity) then
        if (biharmonic) then
          call mom_u_del2u( bi,bj,k,ufld,hfacz,v4f,mythid )
        endif
        call mom_u_xviscflux( bi,bj,k,ufld,v4f,fzon,viscah_d,visca4_d,
     $mythid )
        call mom_u_yviscflux( bi,bj,k,ufld,v4f,hfacz,fmer,viscah_z,
     $visca4_z,mythid )
        if ( .not. implicitviscosity) then
          call mom_u_rviscflux( bi,bj,k,uvel,kapparu,fvrup,mythid )
          help_j = k+1
          call mom_u_rviscflux( bi,bj,help_j,uvel,kapparu,fvrdw,mythid )
        endif
        do j = jmin, jmax
          do i = imin, imax
            gudiss(i,j) = -(recip_hfacw(i,j,k,bi,bj)*recip_drf(k)*
     $recip_raw(i,j,bi,bj)*recip_deepfac2c(k)*((fzon(i,j)-fzon(i-1,j))*
     $ahdudxfac+(fmer(i,j+1)-fmer(i,j))*ahdudyfac+(fvrdw(i,j)-fvrup(i,j)
     $)*rksign*ardudrfac*recip_rhofacc(k)))
          end do
        end do
        if (no_slip_sides) then
          call mom_u_sidedrag( bi,bj,k,ufld,v4f,hfacz,viscah_z,visca4_z,
     $harmonic,biharmonic,usevariableviscosity,vf,mythid )
          do j = jmin, jmax
            do i = imin, imax
              gudiss(i,j) = gudiss(i,j)+vf(i,j)
            end do
          end do
        endif
        if (bottomdragterms) then
          call mom_u_bottomdrag( bi,bj,k,ufld,ke,kapparu,vf,mythid )
          do j = jmin, jmax
            do i = imin, imax
              gudiss(i,j) = gudiss(i,j)+vf(i,j)
            end do
          end do
        endif
      endif
      if (usenhmterms) then
        call mom_u_metric_nh( bi,bj,k,ufld,wvel,mt,mythid )
        do j = jmin, jmax
          do i = imin, imax
            gu(i,j,k,bi,bj) = gu(i,j,k,bi,bj)+mtnhfacu*mt(i,j)
          end do
        end do
      endif
      if (usingsphericalpolargrid .and. metricterms) then
        call mom_u_metric_sphere( bi,bj,k,ufld,vfld,mt,mythid )
        do j = jmin, jmax
          do i = imin, imax
            gu(i,j,k,bi,bj) = gu(i,j,k,bi,bj)+mtfacu*mt(i,j)
          end do
        end do
      endif
      if (usingcylindricalgrid .and. metricterms) then
        call mom_u_metric_cylinder( bi,bj,k,ufld,vfld,mt,mythid )
        do j = jmin, jmax
          do i = imin, imax
            gu(i,j,k,bi,bj) = gu(i,j,k,bi,bj)+mtfacu*mt(i,j)
          end do
        end do
      endif
      if (momadvection) then
        call mom_v_adv_uv( bi,bj,k,utrans,vfld,fzon,mythid )
        call mom_v_adv_vv( bi,bj,k,vtrans,vfld,fmer,mythid )
        help_k = k+1
        call mom_v_adv_wv( bi,bj,help_k,vvel,wvel,rtransv,fverv(1-olx,1-
     $oly,kdown),mythid )
        do j = jmin, jmax
          do i = imin, imax
            gv(i,j,k,bi,bj) = -(recip_hfacs(i,j,k,bi,bj)*recip_drf(k)*
     $recip_ras(i,j,bi,bj)*recip_deepfac2c(k)*recip_rhofacc(k)*((fzon(i+
     $1,j)-fzon(i,j))*udvdxfac+(fmer(i,j)-fmer(i,j-1))*vdvdyfac+(fverv(
     $i,j,kdown)-fverv(i,j,kup))*rksign*rveldvdrfac))
          end do
        end do
      else
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            gv(i,j,k,bi,bj) = 0.d0
          end do
        end do
      endif
      if (momviscosity) then
        if (biharmonic) then
          call mom_v_del2v( bi,bj,k,vfld,hfacz,v4f,mythid )
        endif
        call mom_v_xviscflux( bi,bj,k,vfld,v4f,hfacz,fzon,viscah_z,
     $visca4_z,mythid )
        call mom_v_yviscflux( bi,bj,k,vfld,v4f,fmer,viscah_d,visca4_d,
     $mythid )
        if ( .not. implicitviscosity) then
          call mom_v_rviscflux( bi,bj,k,vvel,kapparv,fvrup,mythid )
          help_l = k+1
          call mom_v_rviscflux( bi,bj,help_l,vvel,kapparv,fvrdw,mythid )
        endif
        do j = jmin, jmax
          do i = imin, imax
            gvdiss(i,j) = -(recip_hfacs(i,j,k,bi,bj)*recip_drf(k)*
     $recip_ras(i,j,bi,bj)*recip_deepfac2c(k)*((fzon(i+1,j)-fzon(i,j))*
     $ahdvdxfac+(fmer(i,j)-fmer(i,j-1))*ahdvdyfac+(fvrdw(i,j)-fvrup(i,j)
     $)*rksign*ardvdrfac*recip_rhofacc(k)))
          end do
        end do
        if (no_slip_sides) then
          call mom_v_sidedrag( bi,bj,k,vfld,v4f,hfacz,viscah_z,visca4_z,
     $harmonic,biharmonic,usevariableviscosity,vf,mythid )
          do j = jmin, jmax
            do i = imin, imax
              gvdiss(i,j) = gvdiss(i,j)+vf(i,j)
            end do
          end do
        endif
        if (bottomdragterms) then
          call mom_v_bottomdrag( bi,bj,k,vfld,ke,kapparv,vf,mythid )
          do j = jmin, jmax
            do i = imin, imax
              gvdiss(i,j) = gvdiss(i,j)+vf(i,j)
            end do
          end do
        endif
      endif
      if (usenhmterms) then
        call mom_v_metric_nh( bi,bj,k,vfld,wvel,mt,mythid )
        do j = jmin, jmax
          do i = imin, imax
            gv(i,j,k,bi,bj) = gv(i,j,k,bi,bj)+mtnhfacv*mt(i,j)
          end do
        end do
      endif
      if (usingsphericalpolargrid .and. metricterms) then
        call mom_v_metric_sphere( bi,bj,k,ufld,mt,mythid )
        do j = jmin, jmax
          do i = imin, imax
            gv(i,j,k,bi,bj) = gv(i,j,k,bi,bj)+mtfacv*mt(i,j)
          end do
        end do
      endif
      if (usingcylindricalgrid .and. metricterms) then
        call mom_v_metric_cylinder( bi,bj,k,ufld,vfld,mt,mythid )
        do j = jmin, jmax
          do i = imin, imax
            gv(i,j,k,bi,bj) = gv(i,j,k,bi,bj)+mtfacv*mt(i,j)
          end do
        end do
      endif
      if ( .not. usecdscheme) then
        call mom_u_coriolis( bi,bj,k,vfld,cf,mythid )
        do j = jmin, jmax
          do i = imin, imax
            gu(i,j,k,bi,bj) = gu(i,j,k,bi,bj)+fufac*cf(i,j)
          end do
        end do
        call mom_v_coriolis( bi,bj,k,ufld,cf,mythid )
        do j = jmin, jmax
          do i = imin, imax
            gv(i,j,k,bi,bj) = gv(i,j,k,bi,bj)+fvfac*cf(i,j)
          end do
        end do
      endif
      if (use3dcoriolis) then
        call mom_u_coriolis_nh( bi,bj,k,wvel,cf,mythid )
        do j = jmin, jmax
          do i = imin, imax
            gu(i,j,k,bi,bj) = gu(i,j,k,bi,bj)+fufac*cf(i,j)
          end do
        end do
        if (usingcurvilineargrid) then
          call mom_v_coriolis_nh( bi,bj,k,wvel,cf,mythid )
          do j = jmin, jmax
            do i = imin, imax
              gv(i,j,k,bi,bj) = gv(i,j,k,bi,bj)+fvfac*cf(i,j)
            end do
          end do
        endif
      endif
      do j = jmin, jmax
        do i = imin, imax
          gu(i,j,k,bi,bj) = gu(i,j,k,bi,bj)*maskw(i,j,k,bi,bj)
          gudiss(i,j) = gudiss(i,j)*maskw(i,j,k,bi,bj)
          gv(i,j,k,bi,bj) = gv(i,j,k,bi,bj)*masks(i,j,k,bi,bj)
          gvdiss(i,j) = gvdiss(i,j)*masks(i,j,k,bi,bj)
        end do
      end do
      end

      subroutine admom_hdissip( bi, bj, tension, adtension, strain, 
     $adstrain, viscah_s, adviscah_s, viscah_t, adviscah_t, harmonic, 
     $adudissip, advdissip )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adstrain(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtension(1-olx:snx+olx,1-oly:sny+oly)
      double precision adudissip(1-olx:snx+olx,1-oly:sny+oly)
      double precision advdissip(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_s(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_t(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      logical harmonic
      double precision strain(1-olx:snx+olx,1-oly:sny+oly)
      double precision tension(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_s(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_t(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (harmonic) then
        do j = 2-oly, sny+oly-1
          do i = 2-olx, snx+olx-1
            adstrain(i+1,j) = adstrain(i+1,j)+advdissip(i,j)*recip_dyc(
     $i,j,bi,bj)*recip_dyc(i,j,bi,bj)*recip_dxg(i,j,bi,bj)*dyu(i+1,j,bi,
     $bj)*dyu(i+1,j,bi,bj)*viscah_s(i+1,j)
            adstrain(i,j) = adstrain(i,j)-advdissip(i,j)*recip_dyc(i,j,
     $bi,bj)*recip_dyc(i,j,bi,bj)*recip_dxg(i,j,bi,bj)*dyu(i,j,bi,bj)*
     $dyu(i,j,bi,bj)*viscah_s(i,j)
            adtension(i,j-1) = adtension(i,j-1)+advdissip(i,j)*
     $recip_dxg(i,j,bi,bj)*recip_dxg(i,j,bi,bj)*recip_dyc(i,j,bi,bj)*
     $dxf(i,j-1,bi,bj)*dxf(i,j-1,bi,bj)*viscah_t(i,j-1)
            adtension(i,j) = adtension(i,j)-advdissip(i,j)*recip_dxg(i,
     $j,bi,bj)*recip_dxg(i,j,bi,bj)*recip_dyc(i,j,bi,bj)*dxf(i,j,bi,bj)*
     $dxf(i,j,bi,bj)*viscah_t(i,j)
            adviscah_s(i+1,j) = adviscah_s(i+1,j)+advdissip(i,j)*
     $recip_dyc(i,j,bi,bj)*recip_dyc(i,j,bi,bj)*recip_dxg(i,j,bi,bj)*
     $dyu(i+1,j,bi,bj)*dyu(i+1,j,bi,bj)*strain(i+1,j)
            adviscah_s(i,j) = adviscah_s(i,j)-advdissip(i,j)*recip_dyc(
     $i,j,bi,bj)*recip_dyc(i,j,bi,bj)*recip_dxg(i,j,bi,bj)*dyu(i,j,bi,
     $bj)*dyu(i,j,bi,bj)*strain(i,j)
            adviscah_t(i,j-1) = adviscah_t(i,j-1)+advdissip(i,j)*
     $recip_dxg(i,j,bi,bj)*recip_dxg(i,j,bi,bj)*recip_dyc(i,j,bi,bj)*
     $dxf(i,j-1,bi,bj)*dxf(i,j-1,bi,bj)*tension(i,j-1)
            adviscah_t(i,j) = adviscah_t(i,j)-advdissip(i,j)*recip_dxg(
     $i,j,bi,bj)*recip_dxg(i,j,bi,bj)*recip_dyc(i,j,bi,bj)*dxf(i,j,bi,
     $bj)*dxf(i,j,bi,bj)*tension(i,j)
            advdissip(i,j) = 0.d0
            adstrain(i,j+1) = adstrain(i,j+1)+adudissip(i,j)*recip_dxc(
     $i,j,bi,bj)*recip_dxc(i,j,bi,bj)*recip_dyg(i,j,bi,bj)*dxv(i,j+1,bi,
     $bj)*dxv(i,j+1,bi,bj)*viscah_s(i,j+1)
            adstrain(i,j) = adstrain(i,j)-adudissip(i,j)*recip_dxc(i,j,
     $bi,bj)*recip_dxc(i,j,bi,bj)*recip_dyg(i,j,bi,bj)*dxv(i,j,bi,bj)*
     $dxv(i,j,bi,bj)*viscah_s(i,j)
            adtension(i-1,j) = adtension(i-1,j)-adudissip(i,j)*
     $recip_dyg(i,j,bi,bj)*recip_dyg(i,j,bi,bj)*recip_dxc(i,j,bi,bj)*
     $dyf(i-1,j,bi,bj)*dyf(i-1,j,bi,bj)*viscah_t(i-1,j)
            adtension(i,j) = adtension(i,j)+adudissip(i,j)*recip_dyg(i,
     $j,bi,bj)*recip_dyg(i,j,bi,bj)*recip_dxc(i,j,bi,bj)*dyf(i,j,bi,bj)*
     $dyf(i,j,bi,bj)*viscah_t(i,j)
            adviscah_s(i,j+1) = adviscah_s(i,j+1)+adudissip(i,j)*
     $recip_dxc(i,j,bi,bj)*recip_dxc(i,j,bi,bj)*recip_dyg(i,j,bi,bj)*
     $dxv(i,j+1,bi,bj)*dxv(i,j+1,bi,bj)*strain(i,j+1)
            adviscah_s(i,j) = adviscah_s(i,j)-adudissip(i,j)*recip_dxc(
     $i,j,bi,bj)*recip_dxc(i,j,bi,bj)*recip_dyg(i,j,bi,bj)*dxv(i,j,bi,
     $bj)*dxv(i,j,bi,bj)*strain(i,j)
            adviscah_t(i-1,j) = adviscah_t(i-1,j)-adudissip(i,j)*
     $recip_dyg(i,j,bi,bj)*recip_dyg(i,j,bi,bj)*recip_dxc(i,j,bi,bj)*
     $dyf(i-1,j,bi,bj)*dyf(i-1,j,bi,bj)*tension(i-1,j)
            adviscah_t(i,j) = adviscah_t(i,j)+adudissip(i,j)*recip_dyg(
     $i,j,bi,bj)*recip_dyg(i,j,bi,bj)*recip_dxc(i,j,bi,bj)*dyf(i,j,bi,
     $bj)*dyf(i,j,bi,bj)*tension(i,j)
            adudissip(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine admom_quasihydrostatic( bi, bj, k, ufld, adufld, vfld, 
     $advfld, adeffectivebuoy )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer snx
      parameter ( snx = 45 )
      integer imax
      parameter ( imax = snx+1 )
      integer imin
      parameter ( imin = 0 )
      integer sny
      parameter ( sny = 20 )
      integer jmax
      parameter ( jmax = sny+1 )
      integer jmin
      parameter ( jmin = 0 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adeffectivebuoy(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer k
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      double precision scalingfactor

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      scalingfactor = rhoconst*gravitysign*recip_gravity
      if (usenhmterms) then
        do j = jmin, jmax
          do i = imin, imax
            adufld(i+1,j,k,bi,bj) = adufld(i+1,j,k,bi,bj)+
     $adeffectivebuoy(i,j)*scalingfactor*ufld(i+1,j,k,bi,bj)*
     $recip_rsphere*recip_deepfacc(k)
            adufld(i,j,k,bi,bj) = adufld(i,j,k,bi,bj)+adeffectivebuoy(i,
     $j)*scalingfactor*ufld(i,j,k,bi,bj)*recip_rsphere*recip_deepfacc(k)
            advfld(i,j+1,k,bi,bj) = advfld(i,j+1,k,bi,bj)+
     $adeffectivebuoy(i,j)*scalingfactor*vfld(i,j+1,k,bi,bj)*
     $recip_rsphere*recip_deepfacc(k)
            advfld(i,j,k,bi,bj) = advfld(i,j,k,bi,bj)+adeffectivebuoy(i,
     $j)*scalingfactor*vfld(i,j,k,bi,bj)*recip_rsphere*recip_deepfacc(k)
          end do
        end do
      endif
      if (use3dcoriolis) then
        do j = jmin, jmax
          do i = imin, imax
            adufld(i+1,j,k,bi,bj) = adufld(i+1,j,k,bi,bj)+0.5d0*
     $adeffectivebuoy(i,j)*scalingfactor*fcoricos(i,j,bi,bj)*anglecosc(
     $i,j,bi,bj)
            adufld(i,j,k,bi,bj) = adufld(i,j,k,bi,bj)+0.5d0*
     $adeffectivebuoy(i,j)*scalingfactor*fcoricos(i,j,bi,bj)*anglecosc(
     $i,j,bi,bj)
            advfld(i,j+1,k,bi,bj) = advfld(i,j+1,k,bi,bj)-0.5d0*
     $adeffectivebuoy(i,j)*scalingfactor*fcoricos(i,j,bi,bj)*anglesinc(
     $i,j,bi,bj)
            advfld(i,j,k,bi,bj) = advfld(i,j,k,bi,bj)-0.5d0*
     $adeffectivebuoy(i,j)*scalingfactor*fcoricos(i,j,bi,bj)*anglesinc(
     $i,j,bi,bj)
          end do
        end do
      endif

      end

      subroutine admom_u_adv_uu( utrans, adutrans, ufld, adufld, 
     $adadvectfluxuu )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
C==============================================
C declare arguments
C==============================================
      double precision adadvectfluxuu(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly, sny+oly-1
        do i = 1-olx, snx+olx-1
          adufld(i+1,j) = adufld(i+1,j)+0.25*adadvectfluxuu(i,j)*(
     $utrans(i,j)+utrans(i+1,j))
          adufld(i,j) = adufld(i,j)+0.25*adadvectfluxuu(i,j)*(utrans(i,
     $j)+utrans(i+1,j))
          adutrans(i+1,j) = adutrans(i+1,j)+0.25*adadvectfluxuu(i,j)*(
     $ufld(i,j)+ufld(i+1,j))
          adutrans(i,j) = adutrans(i,j)+0.25*adadvectfluxuu(i,j)*(ufld(
     $i,j)+ufld(i+1,j))
          adadvectfluxuu(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_u_adv_vu( vtrans, advtrans, ufld, adufld, 
     $adadvectfluxvu )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
C==============================================
C declare arguments
C==============================================
      double precision adadvectfluxvu(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly+1, sny+oly
        do i = 1-olx+1, snx+olx
          adufld(i,j-1) = adufld(i,j-1)+0.25*adadvectfluxvu(i,j)*(
     $vtrans(i,j)+vtrans(i-1,j))
          adufld(i,j) = adufld(i,j)+0.25*adadvectfluxvu(i,j)*(vtrans(i,
     $j)+vtrans(i-1,j))
          advtrans(i-1,j) = advtrans(i-1,j)+0.25*adadvectfluxvu(i,j)*(
     $ufld(i,j)+ufld(i,j-1))
          advtrans(i,j) = advtrans(i,j)+0.25*adadvectfluxvu(i,j)*(ufld(
     $i,j)+ufld(i,j-1))
          adadvectfluxvu(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_u_adv_wu( bi, bj, k, ufld, adufld, wfld, adwfld, 
     $rtrans, adrtrans, adadvectivefluxwu )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adadvectivefluxwu(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer k
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (k .eq. nr+1 .and. userealfreshwaterflux .and. usingpcoords) 
     $then
        do j = 1-oly+1, sny+oly
          do i = 1-olx+1, snx+olx
            adrtrans(i,j) = adrtrans(i,j)+adadvectivefluxwu(i,j)*ufld(i,
     $j,k-1,bi,bj)
            adufld(i,j,k-1,bi,bj) = adufld(i,j,k-1,bi,bj)+
     $adadvectivefluxwu(i,j)*rtrans(i,j)
            adadvectivefluxwu(i,j) = 0.d0
          end do
        end do
      else if (k .gt. nr .or. k .eq. 1 .and. rigidlid) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adadvectivefluxwu(i,j) = 0.d0
          end do
        end do
      else if (k .eq. 1) then
        do j = 1-oly+1, sny+oly
          do i = 1-olx+1, snx+olx
            adrtrans(i,j) = adrtrans(i,j)+adadvectivefluxwu(i,j)*ufld(i,
     $j,k,bi,bj)
            adufld(i,j,k,bi,bj) = adufld(i,j,k,bi,bj)+adadvectivefluxwu(
     $i,j)*rtrans(i,j)
            adadvectivefluxwu(i,j) = 0.d0
          end do
        end do
      else
        if (select_rstar .eq. 0 .and. ( .not. rigidlid)) then
          do j = 1-oly+1, sny+oly
            do i = 1-olx+1, snx+olx
              adufld(i,j,k,bi,bj) = adufld(i,j,k,bi,bj)+0.25*
     $adadvectivefluxwu(i,j)*(wfld(i,j,k,bi,bj)*ra(i,j,bi,bj)*(maskc(i,
     $j,k,bi,bj)-maskc(i,j,k-1,bi,bj))+wfld(i-1,j,k,bi,bj)*ra(i-1,j,bi,
     $bj)*(maskc(i-1,j,k,bi,bj)-maskc(i-1,j,k-1,bi,bj)))*deepfac2f(k)*
     $rhofacf(k)
              adwfld(i-1,j,k,bi,bj) = adwfld(i-1,j,k,bi,bj)+0.25*
     $adadvectivefluxwu(i,j)*ra(i-1,j,bi,bj)*(maskc(i-1,j,k,bi,bj)-
     $maskc(i-1,j,k-1,bi,bj))*deepfac2f(k)*rhofacf(k)*ufld(i,j,k,bi,bj)
              adwfld(i,j,k,bi,bj) = adwfld(i,j,k,bi,bj)+0.25*
     $adadvectivefluxwu(i,j)*ra(i,j,bi,bj)*(maskc(i,j,k,bi,bj)-maskc(i,
     $j,k-1,bi,bj))*deepfac2f(k)*rhofacf(k)*ufld(i,j,k,bi,bj)
            end do
          end do
        endif
        do j = 1-oly+1, sny+oly
          do i = 1-olx+1, snx+olx
            adrtrans(i,j) = adrtrans(i,j)+0.5d0*adadvectivefluxwu(i,j)*(
     $ufld(i,j,k,bi,bj)+ufld(i,j,k-1,bi,bj))
            adufld(i,j,k-1,bi,bj) = adufld(i,j,k-1,bi,bj)+0.5d0*
     $adadvectivefluxwu(i,j)*rtrans(i,j)
            adufld(i,j,k,bi,bj) = adufld(i,j,k,bi,bj)+0.5d0*
     $adadvectivefluxwu(i,j)*rtrans(i,j)
            adadvectivefluxwu(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine admom_u_bottomdrag( bi, bj, k, ufld, adufld, ke, adke, 
     $kapparu, adudragterms )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adke(1-olx:snx+olx,1-oly:sny+oly)
      double precision adudragterms(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k
      double precision kapparu(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision ke(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adudragtermsh
      double precision dragfac
      integer i
      integer j
      integer kbottom
      integer kdown
      integer kdownc
      double precision maskdown
      double precision rdrckp1
      double precision udragtermsh
      double precision viscfac

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (usingzcoords) then
        kbottom = nr
        kdown = min(k+1,kbottom)
        kdownc = kdown
        dragfac = 1.d0
      else
        kbottom = 1
        kdown = max(k-1,kbottom)
        kdownc = k
        dragfac = mass2runit*rhoconst
      endif
      rdrckp1 = recip_drc(kdownc)
      if (k .eq. kbottom) then
        rdrckp1 = recip_drf(k)
      endif
      viscfac = 0.
      if (no_slip_bottom) then
        viscfac = 1.
      endif
      do j = 1-oly, sny+oly-1
        do i = 1-olx+1, snx+olx-1
          maskdown = maskw(i,j,kdown,bi,bj)
          if (k .eq. kbottom) then
            maskdown = 0.
          endif
          if (ke(i,j)+ke(i-1,j) .ne. 0.) then
            udragtermsh = ke(i,j)+ke(i-1,j)
            adudragtermsh = -(adudragterms(i,j)*recip_hfacw(i,j,k,bi,bj)
     $*recip_drf(k)*bottomdragquadratic*1./(2.*sqrt(udragtermsh))*
     $dragfac*(1.-maskdown)*ufld(i,j))
            adufld(i,j) = adufld(i,j)-adudragterms(i,j)*recip_hfacw(i,j,
     $k,bi,bj)*recip_drf(k)*bottomdragquadratic*dragfac*(1.-maskdown)*
     $sqrt(udragtermsh)
            adke(i-1,j) = adke(i-1,j)+adudragtermsh
            adke(i,j) = adke(i,j)+adudragtermsh
          endif
          adufld(i,j) = adufld(i,j)-adudragterms(i,j)*recip_hfacw(i,j,k,
     $bi,bj)*recip_drf(k)*(2.*kapparu(i,j,kdownc)*rdrckp1*viscfac+
     $bottomdraglinear*dragfac)*(1.-maskdown)
          adudragterms(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_u_coriolis( bi, bj, k, advfld, aducoriolisterm )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision one
      parameter ( one = 1.d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

C==============================================
C declare arguments
C==============================================
      double precision aducoriolisterm(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (usejamartwetpoints) then
        do j = 1-oly, sny+oly-1
          do i = 1-olx+1, snx+olx
            aducoriolisterm(i,j) = aducoriolisterm(i,j)*(4/max(one,
     $masks(i,j,k,bi,bj)+masks(i,j+1,k,bi,bj)+masks(i-1,j,k,bi,bj)+
     $masks(i-1,j+1,k,bi,bj)))
          end do
        end do
      endif
      if (useenergyconservingcoriolis) then
        do j = 1-oly, sny+oly-1
          do i = 1-olx+1, snx+olx
            advfld(i-1,j+1) = advfld(i-1,j+1)+0.25*aducoriolisterm(i,j)*
     $fcori(i-1,j,bi,bj)
            advfld(i,j+1) = advfld(i,j+1)+0.25*aducoriolisterm(i,j)*
     $fcori(i,j,bi,bj)
            advfld(i-1,j) = advfld(i-1,j)+0.25*aducoriolisterm(i,j)*
     $fcori(i-1,j,bi,bj)
            advfld(i,j) = advfld(i,j)+0.25*aducoriolisterm(i,j)*fcori(i,
     $j,bi,bj)
            aducoriolisterm(i,j) = 0.d0
          end do
        end do
      else
        do j = 1-oly, sny+oly-1
          do i = 1-olx+1, snx+olx
            advfld(i-1,j+1) = advfld(i-1,j+1)+0.125*aducoriolisterm(i,j)
     $*(fcori(i,j,bi,bj)+fcori(i-1,j,bi,bj))
            advfld(i,j+1) = advfld(i,j+1)+0.125*aducoriolisterm(i,j)*(
     $fcori(i,j,bi,bj)+fcori(i-1,j,bi,bj))
            advfld(i-1,j) = advfld(i-1,j)+0.125*aducoriolisterm(i,j)*(
     $fcori(i,j,bi,bj)+fcori(i-1,j,bi,bj))
            advfld(i,j) = advfld(i,j)+0.125*aducoriolisterm(i,j)*(fcori(
     $i,j,bi,bj)+fcori(i-1,j,bi,bj))
            aducoriolisterm(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine admom_u_coriolis_nh( bi, bj, k, adwfld, 
     $aducoriolisterm )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision aducoriolisterm(1-olx:snx+olx,1-oly:sny+oly)
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer k

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      integer kp1
      double precision wmsk

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      kp1 = min(k+1,nr)
      wmsk = 1.
      if (k .eq. nr) then
        wmsk = 0.
      endif
      do j = 1-oly, sny+oly
        do i = 2-olx, snx+olx
          adwfld(i-1,j,k,bi,bj) = adwfld(i-1,j,k,bi,bj)+0.25*
     $aducoriolisterm(i,j)*fcoricos(i-1,j,bi,bj)*anglecosc(i-1,j,bi,bj)*
     $rvel2wunit(k)*gravitysign
          adwfld(i,j,k,bi,bj) = adwfld(i,j,k,bi,bj)+0.25*
     $aducoriolisterm(i,j)*fcoricos(i,j,bi,bj)*anglecosc(i,j,bi,bj)*
     $rvel2wunit(k)*gravitysign
          adwfld(i-1,j,kp1,bi,bj) = adwfld(i-1,j,kp1,bi,bj)+0.25*
     $aducoriolisterm(i,j)*fcoricos(i-1,j,bi,bj)*anglecosc(i-1,j,bi,bj)*
     $rvel2wunit(kp1)*wmsk*gravitysign
          adwfld(i,j,kp1,bi,bj) = adwfld(i,j,kp1,bi,bj)+0.25*
     $aducoriolisterm(i,j)*fcoricos(i,j,bi,bj)*anglecosc(i,j,bi,bj)*
     $rvel2wunit(kp1)*wmsk*gravitysign
          aducoriolisterm(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_u_del2u( bi, bj, k, adufld, hfacz, addel2u )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

C==============================================
C declare arguments
C==============================================
      double precision addel2u(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision hfacz(1-olx:snx+olx,1-oly:sny+oly)
      integer k

C==============================================
C declare local variables
C==============================================
      double precision adfmer(1-olx:snx+olx,1-oly:sny+oly)
      double precision adfzon(1-olx:snx+olx,1-oly:sny+oly)
      double precision hfaczclosedn
      double precision hfaczcloseds
      integer i
      integer ip1
      integer ip2
      integer j

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adfmer(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adfzon(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (no_slip_sides) then
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            hfaczcloseds = hfacw(i,j,k,bi,bj)-hfacz(i,j)
            hfaczclosedn = hfacw(i,j,k,bi,bj)-hfacz(i,j+1)
            adufld(i,j) = adufld(i,j)-2*addel2u(i,j)*recip_hfacw(i,j,k,
     $bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*recip_deepfac2c(k)*(
     $hfaczcloseds*dxv(i,j,bi,bj)*recip_dyu(i,j,bi,bj)+hfaczclosedn*dxv(
     $i,j+1,bi,bj)*recip_dyu(i,j+1,bi,bj))*drf(k)*maskw(i,j,k,bi,bj)
          end do
        end do
      endif
      do j = 1-oly+1, sny+oly-1
        do i = 1-olx+1, snx+olx-1
          adfmer(i,j+1) = adfmer(i,j+1)+addel2u(i,j)*recip_drf(k)*
     $recip_hfacw(i,j,k,bi,bj)*recip_raw(i,j,bi,bj)*recip_deepfac2c(k)*
     $maskw(i,j,k,bi,bj)
          adfmer(i,j) = adfmer(i,j)-addel2u(i,j)*recip_drf(k)*
     $recip_hfacw(i,j,k,bi,bj)*recip_raw(i,j,bi,bj)*recip_deepfac2c(k)*
     $maskw(i,j,k,bi,bj)
          adfzon(i-1,j) = adfzon(i-1,j)-addel2u(i,j)*recip_drf(k)*
     $recip_hfacw(i,j,k,bi,bj)*recip_raw(i,j,bi,bj)*recip_deepfac2c(k)*
     $maskw(i,j,k,bi,bj)
          adfzon(i,j) = adfzon(i,j)+addel2u(i,j)*recip_drf(k)*
     $recip_hfacw(i,j,k,bi,bj)*recip_raw(i,j,bi,bj)*recip_deepfac2c(k)*
     $maskw(i,j,k,bi,bj)
          addel2u(i,j) = 0.d0
        end do
      end do
      do j = 1-oly+1, sny+oly
        do i = 1-olx+1, snx+olx-1
          adufld(i,j-1) = adufld(i,j-1)-adfmer(i,j)*drf(k)*hfacz(i,j)*
     $dxv(i,j,bi,bj)*recip_dyu(i,j,bi,bj)
          adufld(i,j) = adufld(i,j)+adfmer(i,j)*drf(k)*hfacz(i,j)*dxv(i,
     $j,bi,bj)*recip_dyu(i,j,bi,bj)
          adfmer(i,j) = 0.d0
        end do
      end do
      do j = 1-oly+1, sny+oly-1
        do i = 1-olx, snx+olx-1
          adufld(i+1,j) = adufld(i+1,j)+adfzon(i,j)*drf(k)*hfacc(i,j,k,
     $bi,bj)*dyf(i,j,bi,bj)*recip_dxf(i,j,bi,bj)
          adufld(i,j) = adufld(i,j)-adfzon(i,j)*drf(k)*hfacc(i,j,k,bi,
     $bj)*dyf(i,j,bi,bj)*recip_dxf(i,j,bi,bj)
          adfzon(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_u_metric_cylinder( bi, bj, ufld, adufld, vfld, 
     $advfld, adumetricterms )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adumetricterms(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      double precision radius

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly, sny+oly-1
        do i = 1-olx+1, snx+olx
          radius = (yg(i,j,bi,bj)+yg(i,j+1,bi,bj))*0.5d0
          if (radius .gt. 0.) then
            adufld(i,j) = adufld(i,j)+adumetricterms(i,j)*(0.25*(vfld(i,
     $j)+vfld(i-1,j)+vfld(i,j+1)+vfld(i-1,j+1))/radius)
            advfld(i-1,j+1) = advfld(i-1,j+1)+adumetricterms(i,j)*(0.25*
     $ufld(i,j)/radius)
            advfld(i,j+1) = advfld(i,j+1)+adumetricterms(i,j)*(0.25*
     $ufld(i,j)/radius)
            advfld(i-1,j) = advfld(i-1,j)+adumetricterms(i,j)*(0.25*
     $ufld(i,j)/radius)
            advfld(i,j) = advfld(i,j)+adumetricterms(i,j)*(0.25*ufld(i,
     $j)/radius)
            adumetricterms(i,j) = 0.d0
          else
            adumetricterms(i,j) = 0.d0
          endif
        end do
      end do

      end

      subroutine admom_u_metric_nh( bi, bj, k, ufld, adufld, wfld, 
     $adwfld, adumetricterms )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adumetricterms(1-olx:snx+olx,1-oly:sny+oly)
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer k
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      integer kp1
      double precision wvelbottomoverride

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      kp1 = min(k+1,nr)
      wvelbottomoverride = 1.
      if (k .eq. nr) then
        wvelbottomoverride = 0.
      endif
      do j = 1-olx, sny+oly
        do i = 1-olx+1, snx+olx
          adufld(i,j) = adufld(i,j)+0.25*adumetricterms(i,j)*
     $recip_rsphere*recip_deepfacc(k)*((wfld(i-1,j,kp1,bi,bj)+wfld(i,j,
     $kp1,bi,bj))*rvel2wunit(kp1)*wvelbottomoverride+(wfld(i-1,j,k,bi,
     $bj)+wfld(i,j,k,bi,bj))*rvel2wunit(k))*gravitysign
          adwfld(i-1,j,k,bi,bj) = adwfld(i-1,j,k,bi,bj)+0.25*
     $adumetricterms(i,j)*ufld(i,j)*recip_rsphere*recip_deepfacc(k)*
     $rvel2wunit(k)*gravitysign
          adwfld(i,j,k,bi,bj) = adwfld(i,j,k,bi,bj)+0.25*adumetricterms(
     $i,j)*ufld(i,j)*recip_rsphere*recip_deepfacc(k)*rvel2wunit(k)*
     $gravitysign
          adwfld(i-1,j,kp1,bi,bj) = adwfld(i-1,j,kp1,bi,bj)+0.25*
     $adumetricterms(i,j)*ufld(i,j)*recip_rsphere*recip_deepfacc(k)*
     $rvel2wunit(kp1)*wvelbottomoverride*gravitysign
          adwfld(i,j,kp1,bi,bj) = adwfld(i,j,kp1,bi,bj)+0.25*
     $adumetricterms(i,j)*ufld(i,j)*recip_rsphere*recip_deepfacc(k)*
     $rvel2wunit(kp1)*wvelbottomoverride*gravitysign
          adumetricterms(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_u_metric_sphere( bi, bj, k, ufld, adufld, vfld, 
     $advfld, adumetricterms )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adumetricterms(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-olx, sny+oly-1
        do i = 1-olx+1, snx+olx
          adufld(i,j) = adufld(i,j)+0.25*adumetricterms(i,j)*
     $recip_rsphere*recip_deepfacc(k)*(vfld(i,j)+vfld(i-1,j)+vfld(i,j+1)
     $+vfld(i-1,j+1))*tanphiatu(i,j,bi,bj)
          advfld(i-1,j+1) = advfld(i-1,j+1)+0.25*adumetricterms(i,j)*
     $ufld(i,j)*recip_rsphere*recip_deepfacc(k)*tanphiatu(i,j,bi,bj)
          advfld(i,j+1) = advfld(i,j+1)+0.25*adumetricterms(i,j)*ufld(i,
     $j)*recip_rsphere*recip_deepfacc(k)*tanphiatu(i,j,bi,bj)
          advfld(i-1,j) = advfld(i-1,j)+0.25*adumetricterms(i,j)*ufld(i,
     $j)*recip_rsphere*recip_deepfacc(k)*tanphiatu(i,j,bi,bj)
          advfld(i,j) = advfld(i,j)+0.25*adumetricterms(i,j)*ufld(i,j)*
     $recip_rsphere*recip_deepfacc(k)*tanphiatu(i,j,bi,bj)
          adumetricterms(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_u_rviscflux( bi, bj, k, adufld, kapparu, 
     $adrviscfluxu )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adrviscfluxu(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer k
      double precision kapparu(1-olx:snx+olx,1-oly:sny+oly,nr)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (k .le. 1 .or. k .gt. nr) then
      else
        do j = 1-oly, sny+oly-1
          do i = 1-olx, snx+olx-1
            adufld(i,j,k-1,bi,bj) = adufld(i,j,k-1,bi,bj)+adrviscfluxu(
     $i,j)*kapparu(i,j,k)*raw(i,j,bi,bj)*deepfac2f(k)*rhofacf(k)*rksign*
     $recip_drc(k)*maskw(i,j,k,bi,bj)*maskw(i,j,k-1,bi,bj)
            adufld(i,j,k,bi,bj) = adufld(i,j,k,bi,bj)-adrviscfluxu(i,j)*
     $kapparu(i,j,k)*raw(i,j,bi,bj)*deepfac2f(k)*rhofacf(k)*rksign*
     $recip_drc(k)*maskw(i,j,k,bi,bj)*maskw(i,j,k-1,bi,bj)
            adrviscfluxu(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine admom_u_sidedrag( bi, bj, k, ufld, adufld, del2u, 
     $addel2u, hfacz, viscah_z, adviscah_z, visca4_z, advisca4_z, 
     $adudragterms )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision addel2u(1-olx:snx+olx,1-oly:sny+oly)
      double precision adudragterms(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_z(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision del2u(1-olx:snx+olx,1-oly:sny+oly)
      double precision hfacz(1-olx:snx+olx,1-oly:sny+oly)
      integer k
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_z(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision a4tmp
      double precision ahtmp
      double precision hfaczclosedn
      double precision hfaczcloseds
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (sidedragfactor .le. 0.) then
        do j = 2-oly, sny+oly-1
          do i = 2-olx, snx+olx-1
            hfaczcloseds = hfacw(i,j,k,bi,bj)-hfacz(i,j)
            hfaczclosedn = hfacw(i,j,k,bi,bj)-hfacz(i,j+1)
            ahtmp = min(viscah+viscahgrid*raw(i,j,bi,bj)/deltatmom,
     $viscahmax)
            a4tmp = min(visca4+visca4grid*raw(i,j,bi,bj)**2/deltatmom,
     $visca4max)
            a4tmp = min(a4tmp,visca4gridmax*raw(i,j,bi,bj)**2/deltatmom)
            a4tmp = max(a4tmp,visca4gridmin*raw(i,j,bi,bj)**2/deltatmom)
            addel2u(i,j) = addel2u(i,j)+2.*adudragterms(i,j)*
     $recip_hfacw(i,j,k,bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*(
     $hfaczcloseds*dxv(i,j,bi,bj)*recip_dyu(i,j,bi,bj)+hfaczclosedn*dxv(
     $i,j+1,bi,bj)*recip_dyu(i,j+1,bi,bj))*drf(k)*a4tmp
            adufld(i,j) = adufld(i,j)-2.*adudragterms(i,j)*recip_hfacw(
     $i,j,k,bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*(hfaczcloseds*dxv(
     $i,j,bi,bj)*recip_dyu(i,j,bi,bj)+hfaczclosedn*dxv(i,j+1,bi,bj)*
     $recip_dyu(i,j+1,bi,bj))*drf(k)*ahtmp
            adudragterms(i,j) = 0.d0
          end do
        end do
      else
        do j = 2-oly, sny+oly-1
          do i = 2-olx, snx+olx-1
            hfaczcloseds = hfacw(i,j,k,bi,bj)-hfacw(i,j-1,k,bi,bj)
            hfaczclosedn = hfacw(i,j,k,bi,bj)-hfacw(i,j+1,k,bi,bj)
            hfaczcloseds = max(0.d0,hfaczcloseds)
            hfaczclosedn = max(0.d0,hfaczclosedn)
            addel2u(i,j) = addel2u(i,j)-adudragterms(i,j)*recip_hfacw(i,
     $j,k,bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*((-(hfaczcloseds*dxv(
     $i,j,bi,bj)*recip_dyu(i,j,bi,bj)*visca4_z(i,j)))-hfaczclosedn*dxv(
     $i,j+1,bi,bj)*recip_dyu(i,j+1,bi,bj)*visca4_z(i,j+1))*drf(k)*
     $sidedragfactor
            adufld(i,j) = adufld(i,j)-adudragterms(i,j)*recip_hfacw(i,j,
     $k,bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*(hfaczcloseds*dxv(i,j,
     $bi,bj)*recip_dyu(i,j,bi,bj)*viscah_z(i,j)+hfaczclosedn*dxv(i,j+1,
     $bi,bj)*recip_dyu(i,j+1,bi,bj)*viscah_z(i,j+1))*drf(k)*
     $sidedragfactor
            advisca4_z(i,j+1) = advisca4_z(i,j+1)+adudragterms(i,j)*
     $recip_hfacw(i,j,k,bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*
     $hfaczclosedn*dxv(i,j+1,bi,bj)*recip_dyu(i,j+1,bi,bj)*del2u(i,j)*
     $drf(k)*sidedragfactor
            advisca4_z(i,j) = advisca4_z(i,j)+adudragterms(i,j)*
     $recip_hfacw(i,j,k,bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*
     $hfaczcloseds*dxv(i,j,bi,bj)*recip_dyu(i,j,bi,bj)*del2u(i,j)*drf(k)
     $*sidedragfactor
            adviscah_z(i,j+1) = adviscah_z(i,j+1)-adudragterms(i,j)*
     $recip_hfacw(i,j,k,bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*
     $hfaczclosedn*dxv(i,j+1,bi,bj)*recip_dyu(i,j+1,bi,bj)*ufld(i,j)*
     $drf(k)*sidedragfactor
            adviscah_z(i,j) = adviscah_z(i,j)-adudragterms(i,j)*
     $recip_hfacw(i,j,k,bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*
     $hfaczcloseds*dxv(i,j,bi,bj)*recip_dyu(i,j,bi,bj)*ufld(i,j)*drf(k)*
     $sidedragfactor
            adudragterms(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine admom_u_xviscflux( bi, bj, k, ufld, adufld, del2u, 
     $addel2u, adxviscfluxu, viscah_d, adviscah_d, visca4_d, advisca4_d 
     $)
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision addel2u(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision adxviscfluxu(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision del2u(1-olx:snx+olx,1-oly:sny+oly)
      integer k
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_d(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly, sny+oly-1
        do i = 1-olx, snx+olx-1
          addel2u(i+1,j) = addel2u(i+1,j)+adxviscfluxu(i,j)*dyf(i,j,bi,
     $bj)*drf(k)*hfacc(i,j,k,bi,bj)*visca4_d(i,j)*cosfacu(j,bi,bj)*
     $recip_dxf(i,j,bi,bj)
          addel2u(i,j) = addel2u(i,j)-adxviscfluxu(i,j)*dyf(i,j,bi,bj)*
     $drf(k)*hfacc(i,j,k,bi,bj)*visca4_d(i,j)*cosfacu(j,bi,bj)*
     $recip_dxf(i,j,bi,bj)
          adufld(i+1,j) = adufld(i+1,j)-adxviscfluxu(i,j)*dyf(i,j,bi,bj)
     $*drf(k)*hfacc(i,j,k,bi,bj)*viscah_d(i,j)*cosfacu(j,bi,bj)*
     $recip_dxf(i,j,bi,bj)
          adufld(i,j) = adufld(i,j)+adxviscfluxu(i,j)*dyf(i,j,bi,bj)*
     $drf(k)*hfacc(i,j,k,bi,bj)*viscah_d(i,j)*cosfacu(j,bi,bj)*
     $recip_dxf(i,j,bi,bj)
          advisca4_d(i,j) = advisca4_d(i,j)+adxviscfluxu(i,j)*dyf(i,j,
     $bi,bj)*drf(k)*hfacc(i,j,k,bi,bj)*(del2u(i+1,j)-del2u(i,j))*
     $cosfacu(j,bi,bj)*recip_dxf(i,j,bi,bj)
          adviscah_d(i,j) = adviscah_d(i,j)-adxviscfluxu(i,j)*dyf(i,j,
     $bi,bj)*drf(k)*hfacc(i,j,k,bi,bj)*(ufld(i+1,j)-ufld(i,j))*cosfacu(
     $j,bi,bj)*recip_dxf(i,j,bi,bj)
          adxviscfluxu(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_u_yviscflux( bi, bj, k, ufld, adufld, del2u, 
     $addel2u, hfacz, adyviscfluxu, viscah_z, adviscah_z, visca4_z, 
     $advisca4_z )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision addel2u(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision adyviscfluxu(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision del2u(1-olx:snx+olx,1-oly:sny+oly)
      double precision hfacz(1-olx:snx+olx,1-oly:sny+oly)
      integer k
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_z(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly+1, sny+oly
        do i = 1-olx, snx+olx
          addel2u(i,j-1) = addel2u(i,j-1)-adyviscfluxu(i,j)*dxv(i,j,bi,
     $bj)*drf(k)*hfacz(i,j)*visca4_z(i,j)*recip_dyu(i,j,bi,bj)
          addel2u(i,j) = addel2u(i,j)+adyviscfluxu(i,j)*dxv(i,j,bi,bj)*
     $drf(k)*hfacz(i,j)*visca4_z(i,j)*recip_dyu(i,j,bi,bj)
          adufld(i,j-1) = adufld(i,j-1)+adyviscfluxu(i,j)*dxv(i,j,bi,bj)
     $*drf(k)*hfacz(i,j)*viscah_z(i,j)*recip_dyu(i,j,bi,bj)
          adufld(i,j) = adufld(i,j)-adyviscfluxu(i,j)*dxv(i,j,bi,bj)*
     $drf(k)*hfacz(i,j)*viscah_z(i,j)*recip_dyu(i,j,bi,bj)
          advisca4_z(i,j) = advisca4_z(i,j)+adyviscfluxu(i,j)*dxv(i,j,
     $bi,bj)*drf(k)*hfacz(i,j)*(del2u(i,j)-del2u(i,j-1))*recip_dyu(i,j,
     $bi,bj)
          adviscah_z(i,j) = adviscah_z(i,j)-adyviscfluxu(i,j)*dxv(i,j,
     $bi,bj)*drf(k)*hfacz(i,j)*(ufld(i,j)-ufld(i,j-1))*recip_dyu(i,j,bi,
     $bj)
          adyviscfluxu(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_v_adv_uv( utrans, adutrans, vfld, advfld, 
     $adadvectfluxuv )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
C==============================================
C declare arguments
C==============================================
      double precision adadvectfluxuv(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly+1, sny+oly
        do i = 1-olx+1, snx+olx
          adutrans(i,j-1) = adutrans(i,j-1)+0.25*adadvectfluxuv(i,j)*(
     $vfld(i,j)+vfld(i-1,j))
          adutrans(i,j) = adutrans(i,j)+0.25*adadvectfluxuv(i,j)*(vfld(
     $i,j)+vfld(i-1,j))
          advfld(i-1,j) = advfld(i-1,j)+0.25*adadvectfluxuv(i,j)*(
     $utrans(i,j)+utrans(i,j-1))
          advfld(i,j) = advfld(i,j)+0.25*adadvectfluxuv(i,j)*(utrans(i,
     $j)+utrans(i,j-1))
          adadvectfluxuv(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_v_adv_vv( vtrans, advtrans, vfld, advfld, 
     $adadvectfluxvv )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
C==============================================
C declare arguments
C==============================================
      double precision adadvectfluxvv(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly, sny+oly-1
        do i = 1-olx, snx+olx-1
          advfld(i,j+1) = advfld(i,j+1)+0.25*adadvectfluxvv(i,j)*(
     $vtrans(i,j)+vtrans(i,j+1))
          advfld(i,j) = advfld(i,j)+0.25*adadvectfluxvv(i,j)*(vtrans(i,
     $j)+vtrans(i,j+1))
          advtrans(i,j+1) = advtrans(i,j+1)+0.25*adadvectfluxvv(i,j)*(
     $vfld(i,j)+vfld(i,j+1))
          advtrans(i,j) = advtrans(i,j)+0.25*adadvectfluxvv(i,j)*(vfld(
     $i,j)+vfld(i,j+1))
          adadvectfluxvv(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_v_adv_wv( bi, bj, k, vfld, advfld, wfld, adwfld, 
     $rtrans, adrtrans, adadvectivefluxwv )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adadvectivefluxwv(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer k
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (k .eq. nr+1 .and. userealfreshwaterflux .and. usingpcoords) 
     $then
        do j = 1-oly+1, sny+oly
          do i = 1-olx+1, snx+olx
            adrtrans(i,j) = adrtrans(i,j)+adadvectivefluxwv(i,j)*vfld(i,
     $j,k-1,bi,bj)
            advfld(i,j,k-1,bi,bj) = advfld(i,j,k-1,bi,bj)+
     $adadvectivefluxwv(i,j)*rtrans(i,j)
            adadvectivefluxwv(i,j) = 0.d0
          end do
        end do
      else if (k .gt. nr .or. k .eq. 1 .and. rigidlid) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adadvectivefluxwv(i,j) = 0.d0
          end do
        end do
      else if (k .eq. 1) then
        do j = 1-oly+1, sny+oly
          do i = 1-olx+1, snx+olx
            adrtrans(i,j) = adrtrans(i,j)+adadvectivefluxwv(i,j)*vfld(i,
     $j,k,bi,bj)
            advfld(i,j,k,bi,bj) = advfld(i,j,k,bi,bj)+adadvectivefluxwv(
     $i,j)*rtrans(i,j)
            adadvectivefluxwv(i,j) = 0.d0
          end do
        end do
      else
        if (select_rstar .eq. 0 .and. ( .not. rigidlid)) then
          do j = 1-oly+1, sny+oly
            do i = 1-olx+1, snx+olx
              advfld(i,j,k,bi,bj) = advfld(i,j,k,bi,bj)+0.25*
     $adadvectivefluxwv(i,j)*(wfld(i,j,k,bi,bj)*ra(i,j,bi,bj)*(maskc(i,
     $j,k,bi,bj)-maskc(i,j,k-1,bi,bj))+wfld(i,j-1,k,bi,bj)*ra(i,j-1,bi,
     $bj)*(maskc(i,j-1,k,bi,bj)-maskc(i,j-1,k-1,bi,bj)))*deepfac2f(k)*
     $rhofacf(k)
              adwfld(i,j-1,k,bi,bj) = adwfld(i,j-1,k,bi,bj)+0.25*
     $adadvectivefluxwv(i,j)*ra(i,j-1,bi,bj)*(maskc(i,j-1,k,bi,bj)-
     $maskc(i,j-1,k-1,bi,bj))*deepfac2f(k)*rhofacf(k)*vfld(i,j,k,bi,bj)
              adwfld(i,j,k,bi,bj) = adwfld(i,j,k,bi,bj)+0.25*
     $adadvectivefluxwv(i,j)*ra(i,j,bi,bj)*(maskc(i,j,k,bi,bj)-maskc(i,
     $j,k-1,bi,bj))*deepfac2f(k)*rhofacf(k)*vfld(i,j,k,bi,bj)
            end do
          end do
        endif
        do j = 1-oly+1, sny+oly
          do i = 1-olx+1, snx+olx
            adrtrans(i,j) = adrtrans(i,j)+0.5d0*adadvectivefluxwv(i,j)*(
     $vfld(i,j,k,bi,bj)+vfld(i,j,k-1,bi,bj))
            advfld(i,j,k-1,bi,bj) = advfld(i,j,k-1,bi,bj)+0.5d0*
     $adadvectivefluxwv(i,j)*rtrans(i,j)
            advfld(i,j,k,bi,bj) = advfld(i,j,k,bi,bj)+0.5d0*
     $adadvectivefluxwv(i,j)*rtrans(i,j)
            adadvectivefluxwv(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine admom_v_bottomdrag( bi, bj, k, vfld, advfld, ke, adke, 
     $kapparv, advdragterms )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adke(1-olx:snx+olx,1-oly:sny+oly)
      double precision advdragterms(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k
      double precision kapparv(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision ke(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision advdragtermsh
      double precision dragfac
      integer i
      integer j
      integer kbottom
      integer kdown
      integer kdownc
      double precision maskdown
      double precision rdrckp1
      double precision vdragtermsh
      double precision viscfac

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (usingzcoords) then
        kbottom = nr
        kdown = min(k+1,kbottom)
        kdownc = kdown
        dragfac = 1.d0
      else
        kbottom = 1
        kdown = max(k-1,kbottom)
        kdownc = k
        dragfac = mass2runit*rhoconst
      endif
      rdrckp1 = recip_drc(kdownc)
      viscfac = 0.
      if (no_slip_bottom) then
        viscfac = 1.
      endif
      if (k .eq. kbottom) then
        rdrckp1 = recip_drf(k)
      endif
      do j = 1-oly+1, sny+oly-1
        do i = 1-olx, snx+olx-1
          maskdown = masks(i,j,kdown,bi,bj)
          if (k .eq. kbottom) then
            maskdown = 0.
          endif
          if (ke(i,j)+ke(i,j-1) .ne. 0.) then
            vdragtermsh = ke(i,j)+ke(i,j-1)
            advdragtermsh = -(advdragterms(i,j)*recip_hfacs(i,j,k,bi,bj)
     $*recip_drf(k)*bottomdragquadratic*1./(2.*sqrt(vdragtermsh))*
     $dragfac*(1.-maskdown)*vfld(i,j))
            advfld(i,j) = advfld(i,j)-advdragterms(i,j)*recip_hfacs(i,j,
     $k,bi,bj)*recip_drf(k)*bottomdragquadratic*dragfac*(1.-maskdown)*
     $sqrt(vdragtermsh)
            adke(i,j-1) = adke(i,j-1)+advdragtermsh
            adke(i,j) = adke(i,j)+advdragtermsh
          endif
          advfld(i,j) = advfld(i,j)-advdragterms(i,j)*recip_hfacs(i,j,k,
     $bi,bj)*recip_drf(k)*(2.*kapparv(i,j,kdownc)*rdrckp1*viscfac+
     $bottomdraglinear*dragfac)*(1.-maskdown)
          advdragterms(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_v_coriolis( bi, bj, k, adufld, advcoriolisterm )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision one
      parameter ( one = 1.d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

C==============================================
C declare arguments
C==============================================
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advcoriolisterm(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (usejamartwetpoints) then
        do j = 1-oly+1, sny+oly
          do i = 1-olx, snx+olx-1
            advcoriolisterm(i,j) = advcoriolisterm(i,j)*(4/max(one,
     $maskw(i,j,k,bi,bj)+maskw(i+1,j,k,bi,bj)+maskw(i,j-1,k,bi,bj)+
     $maskw(i+1,j-1,k,bi,bj)))
          end do
        end do
      endif
      if (useenergyconservingcoriolis) then
        do j = 1-oly+1, sny+oly
          do i = 1-olx, snx+olx-1
            adufld(i+1,j-1) = adufld(i+1,j-1)-0.25*advcoriolisterm(i,j)*
     $fcori(i,j-1,bi,bj)
            adufld(i,j-1) = adufld(i,j-1)-0.25*advcoriolisterm(i,j)*
     $fcori(i,j-1,bi,bj)
            adufld(i+1,j) = adufld(i+1,j)-0.25*advcoriolisterm(i,j)*
     $fcori(i,j,bi,bj)
            adufld(i,j) = adufld(i,j)-0.25*advcoriolisterm(i,j)*fcori(i,
     $j,bi,bj)
            advcoriolisterm(i,j) = 0.d0
          end do
        end do
      else
        do j = 1-oly+1, sny+oly
          do i = 1-olx, snx+olx-1
            adufld(i+1,j-1) = adufld(i+1,j-1)-0.125*advcoriolisterm(i,j)
     $*(fcori(i,j,bi,bj)+fcori(i,j-1,bi,bj))
            adufld(i,j-1) = adufld(i,j-1)-0.125*advcoriolisterm(i,j)*(
     $fcori(i,j,bi,bj)+fcori(i,j-1,bi,bj))
            adufld(i+1,j) = adufld(i+1,j)-0.125*advcoriolisterm(i,j)*(
     $fcori(i,j,bi,bj)+fcori(i,j-1,bi,bj))
            adufld(i,j) = adufld(i,j)-0.125*advcoriolisterm(i,j)*(fcori(
     $i,j,bi,bj)+fcori(i,j-1,bi,bj))
            advcoriolisterm(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine admom_v_coriolis_nh( bi, bj, k, adwfld, 
     $advcoriolisterm )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision advcoriolisterm(1-olx:snx+olx,1-oly:sny+oly)
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer k

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      integer kp1
      double precision wmsk

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      kp1 = min(k+1,nr)
      wmsk = 1.
      if (k .eq. nr) then
        wmsk = 0.
      endif
      do j = 2-oly, sny+oly
        do i = 1-olx, snx+olx
          adwfld(i,j-1,k,bi,bj) = adwfld(i,j-1,k,bi,bj)-0.25*
     $advcoriolisterm(i,j)*fcoricos(i,j-1,bi,bj)*anglesinc(i,j-1,bi,bj)*
     $rvel2wunit(k)*gravitysign
          adwfld(i,j-1,kp1,bi,bj) = adwfld(i,j-1,kp1,bi,bj)-0.25*
     $advcoriolisterm(i,j)*fcoricos(i,j-1,bi,bj)*anglesinc(i,j-1,bi,bj)*
     $rvel2wunit(kp1)*wmsk*gravitysign
          adwfld(i,j,k,bi,bj) = adwfld(i,j,k,bi,bj)-0.25*
     $advcoriolisterm(i,j)*fcoricos(i,j,bi,bj)*anglesinc(i,j,bi,bj)*
     $rvel2wunit(k)*gravitysign
          adwfld(i,j,kp1,bi,bj) = adwfld(i,j,kp1,bi,bj)-0.25*
     $advcoriolisterm(i,j)*fcoricos(i,j,bi,bj)*anglesinc(i,j,bi,bj)*
     $rvel2wunit(kp1)*wmsk*gravitysign
          advcoriolisterm(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_v_del2v( bi, bj, k, advfld, hfacz, addel2v )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

C==============================================
C declare arguments
C==============================================
      double precision addel2v(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision hfacz(1-olx:snx+olx,1-oly:sny+oly)
      integer k

C==============================================
C declare local variables
C==============================================
      double precision adfmer(1-olx:snx+olx,1-oly:sny+oly)
      double precision adfzon(1-olx:snx+olx,1-oly:sny+oly)
      double precision hfaczclosede
      double precision hfaczclosedw
      integer i
      integer ip1
      integer ip2
      integer j

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adfmer(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adfzon(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (no_slip_sides) then
        do j = 1-oly+1, sny+oly-1
          do i = 1-olx+1, snx+olx-1
            hfaczclosedw = hfacs(i,j,k,bi,bj)-hfacz(i,j)
            hfaczclosede = hfacs(i,j,k,bi,bj)-hfacz(i+1,j)
            advfld(i,j) = advfld(i,j)-2*addel2v(i,j)*recip_hfacs(i,j,k,
     $bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*recip_deepfac2c(k)*(
     $hfaczclosedw*dyu(i,j,bi,bj)*recip_dxv(i,j,bi,bj)+hfaczclosede*dyu(
     $i+1,j,bi,bj)*recip_dxv(i+1,j,bi,bj))*drf(k)*masks(i,j,k,bi,bj)
          end do
        end do
      endif
      do j = 1-oly+1, sny+oly-1
        do i = 1-olx+1, snx+olx-1
          adfmer(i,j-1) = adfmer(i,j-1)-addel2v(i,j)*recip_drf(k)*
     $recip_hfacs(i,j,k,bi,bj)*recip_ras(i,j,bi,bj)*recip_deepfac2c(k)*
     $masks(i,j,k,bi,bj)
          adfmer(i,j) = adfmer(i,j)+addel2v(i,j)*recip_drf(k)*
     $recip_hfacs(i,j,k,bi,bj)*recip_ras(i,j,bi,bj)*recip_deepfac2c(k)*
     $masks(i,j,k,bi,bj)
          adfzon(i+1,j) = adfzon(i+1,j)+addel2v(i,j)*recip_drf(k)*
     $recip_hfacs(i,j,k,bi,bj)*recip_ras(i,j,bi,bj)*recip_deepfac2c(k)*
     $masks(i,j,k,bi,bj)
          adfzon(i,j) = adfzon(i,j)-addel2v(i,j)*recip_drf(k)*
     $recip_hfacs(i,j,k,bi,bj)*recip_ras(i,j,bi,bj)*recip_deepfac2c(k)*
     $masks(i,j,k,bi,bj)
          addel2v(i,j) = 0.d0
        end do
      end do
      do j = 1-oly, sny+oly-1
        do i = 1-olx+1, snx+olx-1
          advfld(i,j+1) = advfld(i,j+1)+adfmer(i,j)*drf(k)*hfacc(i,j,k,
     $bi,bj)*dxf(i,j,bi,bj)*recip_dyf(i,j,bi,bj)
          advfld(i,j) = advfld(i,j)-adfmer(i,j)*drf(k)*hfacc(i,j,k,bi,
     $bj)*dxf(i,j,bi,bj)*recip_dyf(i,j,bi,bj)
          adfmer(i,j) = 0.d0
        end do
      end do
      do j = 1-oly+1, sny+oly-1
        do i = 1-olx+1, snx+olx
          advfld(i-1,j) = advfld(i-1,j)-adfzon(i,j)*drf(k)*hfacz(i,j)*
     $dyu(i,j,bi,bj)*recip_dxv(i,j,bi,bj)
          advfld(i,j) = advfld(i,j)+adfzon(i,j)*drf(k)*hfacz(i,j)*dyu(i,
     $j,bi,bj)*recip_dxv(i,j,bi,bj)
          adfzon(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_v_metric_cylinder( bi, bj, ufld, adufld, 
     $advmetricterms )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advmetricterms(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      double precision radius

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly+1, sny+oly
        do i = 1-olx, snx+olx-1
          radius = (yg(i,j,bi,bj)+yg(i+1,j,bi,bj))*0.5d0
          if (radius .gt. 0.) then
            adufld(i+1,j-1) = adufld(i+1,j-1)-advmetricterms(i,j)*(
     $0.125*(ufld(i,j)+ufld(i+1,j)+ufld(i,j-1)+ufld(i+1,j-1))/radius)
            adufld(i,j-1) = adufld(i,j-1)-advmetricterms(i,j)*(0.125*(
     $ufld(i,j)+ufld(i+1,j)+ufld(i,j-1)+ufld(i+1,j-1))/radius)
            adufld(i+1,j) = adufld(i+1,j)-advmetricterms(i,j)*(0.125*(
     $ufld(i,j)+ufld(i+1,j)+ufld(i,j-1)+ufld(i+1,j-1))/radius)
            adufld(i,j) = adufld(i,j)-advmetricterms(i,j)*(0.125*(ufld(
     $i,j)+ufld(i+1,j)+ufld(i,j-1)+ufld(i+1,j-1))/radius)
            advmetricterms(i,j) = 0.d0
          else
            advmetricterms(i,j) = 0.d0
          endif
        end do
      end do

      end

      subroutine admom_v_metric_nh( bi, bj, k, vfld, advfld, wfld, 
     $adwfld, advmetricterms )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advmetricterms(1-olx:snx+olx,1-oly:sny+oly)
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer k
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j
      integer kp1
      double precision wvelbottomoverride

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      kp1 = min(k+1,nr)
      wvelbottomoverride = 1.
      if (k .eq. nr) then
        wvelbottomoverride = 0.
      endif
      do j = 1-olx+1, sny+oly
        do i = 1-olx, snx+olx
          advfld(i,j) = advfld(i,j)+0.25*advmetricterms(i,j)*
     $recip_rsphere*recip_deepfacc(k)*((wfld(i,j-1,kp1,bi,bj)+wfld(i,j,
     $kp1,bi,bj))*rvel2wunit(kp1)*wvelbottomoverride+(wfld(i,j-1,k,bi,
     $bj)+wfld(i,j,k,bi,bj))*rvel2wunit(k))*gravitysign
          adwfld(i,j-1,k,bi,bj) = adwfld(i,j-1,k,bi,bj)+0.25*
     $advmetricterms(i,j)*vfld(i,j)*recip_rsphere*recip_deepfacc(k)*
     $rvel2wunit(k)*gravitysign
          adwfld(i,j-1,kp1,bi,bj) = adwfld(i,j-1,kp1,bi,bj)+0.25*
     $advmetricterms(i,j)*vfld(i,j)*recip_rsphere*recip_deepfacc(k)*
     $rvel2wunit(kp1)*wvelbottomoverride*gravitysign
          adwfld(i,j,k,bi,bj) = adwfld(i,j,k,bi,bj)+0.25*advmetricterms(
     $i,j)*vfld(i,j)*recip_rsphere*recip_deepfacc(k)*rvel2wunit(k)*
     $gravitysign
          adwfld(i,j,kp1,bi,bj) = adwfld(i,j,kp1,bi,bj)+0.25*
     $advmetricterms(i,j)*vfld(i,j)*recip_rsphere*recip_deepfacc(k)*
     $rvel2wunit(kp1)*wvelbottomoverride*gravitysign
          advmetricterms(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_v_metric_sphere( bi, bj, k, ufld, adufld, 
     $advmetricterms )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advmetricterms(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-olx+1, sny+oly
        do i = 1-olx, snx+olx-1
          adufld(i+1,j-1) = adufld(i+1,j-1)-0.125*advmetricterms(i,j)*
     $recip_rsphere*recip_deepfacc(k)*(ufld(i,j)+ufld(i+1,j)+ufld(i,j-1)
     $+ufld(i+1,j-1))*tanphiatv(i,j,bi,bj)
          adufld(i,j-1) = adufld(i,j-1)-0.125*advmetricterms(i,j)*
     $recip_rsphere*recip_deepfacc(k)*(ufld(i,j)+ufld(i+1,j)+ufld(i,j-1)
     $+ufld(i+1,j-1))*tanphiatv(i,j,bi,bj)
          adufld(i+1,j) = adufld(i+1,j)-0.125*advmetricterms(i,j)*
     $recip_rsphere*recip_deepfacc(k)*(ufld(i,j)+ufld(i+1,j)+ufld(i,j-1)
     $+ufld(i+1,j-1))*tanphiatv(i,j,bi,bj)
          adufld(i,j) = adufld(i,j)-0.125*advmetricterms(i,j)*
     $recip_rsphere*recip_deepfacc(k)*(ufld(i,j)+ufld(i+1,j)+ufld(i,j-1)
     $+ufld(i+1,j-1))*tanphiatv(i,j,bi,bj)
          advmetricterms(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_v_rviscflux( bi, bj, k, advfld, kapparv, 
     $adrviscfluxv )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adrviscfluxv(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer k
      double precision kapparv(1-olx:snx+olx,1-oly:sny+oly,nr)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (k .le. 1 .or. k .gt. nr) then
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            adrviscfluxv(i,j) = 0.d0
          end do
        end do
      else
        do j = 1-oly, sny+oly-1
          do i = 1-olx, snx+olx-1
            advfld(i,j,k-1,bi,bj) = advfld(i,j,k-1,bi,bj)+adrviscfluxv(
     $i,j)*kapparv(i,j,k)*ras(i,j,bi,bj)*deepfac2f(k)*rhofacf(k)*rksign*
     $recip_drc(k)*masks(i,j,k,bi,bj)*masks(i,j,k-1,bi,bj)
            advfld(i,j,k,bi,bj) = advfld(i,j,k,bi,bj)-adrviscfluxv(i,j)*
     $kapparv(i,j,k)*ras(i,j,bi,bj)*deepfac2f(k)*rhofacf(k)*rksign*
     $recip_drc(k)*masks(i,j,k,bi,bj)*masks(i,j,k-1,bi,bj)
            adrviscfluxv(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine admom_v_sidedrag( bi, bj, k, vfld, advfld, del2v, 
     $addel2v, hfacz, viscah_z, adviscah_z, visca4_z, advisca4_z, 
     $advdragterms )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision addel2v(1-olx:snx+olx,1-oly:sny+oly)
      double precision advdragterms(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_z(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision del2v(1-olx:snx+olx,1-oly:sny+oly)
      double precision hfacz(1-olx:snx+olx,1-oly:sny+oly)
      integer k
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_z(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision a4tmp
      double precision ahtmp
      double precision hfaczclosede
      double precision hfaczclosedw
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (sidedragfactor .le. 0.) then
        do j = 2-oly, sny+oly-1
          do i = 2-olx, snx+olx-1
            hfaczclosedw = hfacs(i,j,k,bi,bj)-hfacz(i,j)
            hfaczclosede = hfacs(i,j,k,bi,bj)-hfacz(i+1,j)
            ahtmp = min(viscah+viscahgrid*ras(i,j,bi,bj)/deltatmom,
     $viscahmax)
            a4tmp = min(visca4+visca4grid*ras(i,j,bi,bj)**2/deltatmom,
     $visca4max)
            if (visca4gridmax .gt. 0.) then
              a4tmp = min(a4tmp,visca4gridmax*ras(i,j,bi,bj)**2/
     $deltatmom)
            endif
            a4tmp = max(a4tmp,visca4gridmin*ras(i,j,bi,bj)**2/deltatmom)
            addel2v(i,j) = addel2v(i,j)+2.*advdragterms(i,j)*
     $recip_hfacs(i,j,k,bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*(
     $hfaczclosedw*dyu(i,j,bi,bj)*recip_dxv(i,j,bi,bj)+hfaczclosede*dyu(
     $i+1,j,bi,bj)*recip_dxv(i+1,j,bi,bj))*drf(k)*a4tmp*cosfacv(j,bi,bj)
            advfld(i,j) = advfld(i,j)-2.*advdragterms(i,j)*recip_hfacs(
     $i,j,k,bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*(hfaczclosedw*dyu(
     $i,j,bi,bj)*recip_dxv(i,j,bi,bj)+hfaczclosede*dyu(i+1,j,bi,bj)*
     $recip_dxv(i+1,j,bi,bj))*drf(k)*ahtmp*cosfacv(j,bi,bj)
            advdragterms(i,j) = 0.d0
          end do
        end do
      else
        do j = 2-oly, sny+oly-1
          do i = 2-olx, snx+olx-1
            hfaczclosedw = hfacs(i,j,k,bi,bj)-hfacs(i-1,j,k,bi,bj)
            hfaczclosede = hfacs(i,j,k,bi,bj)-hfacs(i+1,j,k,bi,bj)
            hfaczclosedw = max(0.d0,hfaczclosedw)
            hfaczclosede = max(0.d0,hfaczclosede)
            addel2v(i,j) = addel2v(i,j)-advdragterms(i,j)*recip_hfacs(i,
     $j,k,bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*((-(hfaczclosedw*dyu(
     $i,j,bi,bj)*recip_dxv(i,j,bi,bj)*visca4_z(i,j)*cosfacv(j,bi,bj)))-
     $hfaczclosede*dyu(i+1,j,bi,bj)*recip_dxv(i+1,j,bi,bj)*visca4_z(i+1,
     $j)*cosfacv(j,bi,bj))*drf(k)*sidedragfactor
            advfld(i,j) = advfld(i,j)-advdragterms(i,j)*recip_hfacs(i,j,
     $k,bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*(hfaczclosedw*dyu(i,j,
     $bi,bj)*recip_dxv(i,j,bi,bj)*viscah_z(i,j)*cosfacv(j,bi,bj)+
     $hfaczclosede*dyu(i+1,j,bi,bj)*recip_dxv(i+1,j,bi,bj)*viscah_z(i+1,
     $j)*cosfacv(j,bi,bj))*drf(k)*sidedragfactor
            advisca4_z(i+1,j) = advisca4_z(i+1,j)+advdragterms(i,j)*
     $recip_hfacs(i,j,k,bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*
     $hfaczclosede*dyu(i+1,j,bi,bj)*recip_dxv(i+1,j,bi,bj)*del2v(i,j)*
     $cosfacv(j,bi,bj)*drf(k)*sidedragfactor
            advisca4_z(i,j) = advisca4_z(i,j)+advdragterms(i,j)*
     $recip_hfacs(i,j,k,bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*
     $hfaczclosedw*dyu(i,j,bi,bj)*recip_dxv(i,j,bi,bj)*del2v(i,j)*
     $cosfacv(j,bi,bj)*drf(k)*sidedragfactor
            adviscah_z(i+1,j) = adviscah_z(i+1,j)-advdragterms(i,j)*
     $recip_hfacs(i,j,k,bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*
     $hfaczclosede*dyu(i+1,j,bi,bj)*recip_dxv(i+1,j,bi,bj)*vfld(i,j)*
     $cosfacv(j,bi,bj)*drf(k)*sidedragfactor
            adviscah_z(i,j) = adviscah_z(i,j)-advdragterms(i,j)*
     $recip_hfacs(i,j,k,bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*
     $hfaczclosedw*dyu(i,j,bi,bj)*recip_dxv(i,j,bi,bj)*vfld(i,j)*
     $cosfacv(j,bi,bj)*drf(k)*sidedragfactor
            advdragterms(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine admom_v_xviscflux( bi, bj, k, vfld, advfld, del2v, 
     $addel2v, hfacz, adxviscfluxv, viscah_z, adviscah_z, visca4_z, 
     $advisca4_z )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision addel2v(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision adxviscfluxv(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision del2v(1-olx:snx+olx,1-oly:sny+oly)
      double precision hfacz(1-olx:snx+olx,1-oly:sny+oly)
      integer k
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_z(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly, sny+oly
        do i = 1-olx+1, snx+olx
          addel2v(i-1,j) = addel2v(i-1,j)-adxviscfluxv(i,j)*dyu(i,j,bi,
     $bj)*drf(k)*hfacz(i,j)*visca4_z(i,j)*cosfacv(j,bi,bj)*recip_dxv(i,
     $j,bi,bj)
          addel2v(i,j) = addel2v(i,j)+adxviscfluxv(i,j)*dyu(i,j,bi,bj)*
     $drf(k)*hfacz(i,j)*visca4_z(i,j)*cosfacv(j,bi,bj)*recip_dxv(i,j,bi,
     $bj)
          advfld(i-1,j) = advfld(i-1,j)+adxviscfluxv(i,j)*dyu(i,j,bi,bj)
     $*drf(k)*hfacz(i,j)*viscah_z(i,j)*cosfacv(j,bi,bj)*recip_dxv(i,j,
     $bi,bj)
          advfld(i,j) = advfld(i,j)-adxviscfluxv(i,j)*dyu(i,j,bi,bj)*
     $drf(k)*hfacz(i,j)*viscah_z(i,j)*cosfacv(j,bi,bj)*recip_dxv(i,j,bi,
     $bj)
          advisca4_z(i,j) = advisca4_z(i,j)+adxviscfluxv(i,j)*dyu(i,j,
     $bi,bj)*drf(k)*hfacz(i,j)*(del2v(i,j)-del2v(i-1,j))*cosfacv(j,bi,
     $bj)*recip_dxv(i,j,bi,bj)
          adviscah_z(i,j) = adviscah_z(i,j)-adxviscfluxv(i,j)*dyu(i,j,
     $bi,bj)*drf(k)*hfacz(i,j)*(vfld(i,j)-vfld(i-1,j))*cosfacv(j,bi,bj)*
     $recip_dxv(i,j,bi,bj)
          adxviscfluxv(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_v_yviscflux( bi, bj, k, vfld, advfld, del2v, 
     $addel2v, adyviscfluxv, viscah_d, adviscah_d, visca4_d, advisca4_d 
     $)
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision addel2v(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision adyviscfluxv(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision del2v(1-olx:snx+olx,1-oly:sny+oly)
      integer k
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_d(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly, sny+oly-1
        do i = 1-olx, snx+olx-1
          addel2v(i,j+1) = addel2v(i,j+1)+adyviscfluxv(i,j)*dxf(i,j,bi,
     $bj)*drf(k)*hfacc(i,j,k,bi,bj)*visca4_d(i,j)*recip_dyf(i,j,bi,bj)
          addel2v(i,j) = addel2v(i,j)-adyviscfluxv(i,j)*dxf(i,j,bi,bj)*
     $drf(k)*hfacc(i,j,k,bi,bj)*visca4_d(i,j)*recip_dyf(i,j,bi,bj)
          advfld(i,j+1) = advfld(i,j+1)-adyviscfluxv(i,j)*dxf(i,j,bi,bj)
     $*drf(k)*hfacc(i,j,k,bi,bj)*viscah_d(i,j)*recip_dyf(i,j,bi,bj)
          advfld(i,j) = advfld(i,j)+adyviscfluxv(i,j)*dxf(i,j,bi,bj)*
     $drf(k)*hfacc(i,j,k,bi,bj)*viscah_d(i,j)*recip_dyf(i,j,bi,bj)
          advisca4_d(i,j) = advisca4_d(i,j)+adyviscfluxv(i,j)*dxf(i,j,
     $bi,bj)*drf(k)*hfacc(i,j,k,bi,bj)*(del2v(i,j+1)-del2v(i,j))*
     $recip_dyf(i,j,bi,bj)
          adviscah_d(i,j) = adviscah_d(i,j)-adyviscfluxv(i,j)*dxf(i,j,
     $bi,bj)*drf(k)*hfacc(i,j,k,bi,bj)*(vfld(i,j+1)-vfld(i,j))*
     $recip_dyf(i,j,bi,bj)
          adyviscfluxv(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_vecinv( bi, bj, imin, imax, jmin, jmax, k, kup, 
     $kdown, kapparu, kapparv, adfveru, adfverv, adgudiss, adgvdiss, 
     $mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      real*8 comlev1_bibj_k_vort3_38h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadvort3/ comlev1_bibj_k_vort3_38h

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      double precision adfveru(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision adfverv(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision adgudiss(1-olx:snx+olx,1-oly:sny+oly)
      double precision adgvdiss(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k
      double precision kapparu(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision kapparv(1-olx:snx+olx,1-oly:sny+oly,nr)
      integer kdown
      integer kup
      integer mythid

C==============================================
C declare local variables
C==============================================
      integer act0
      integer act1
      integer act2
      integer act3
      integer act4
      double precision addel2u(1-olx:snx+olx,1-oly:sny+oly)
      double precision addel2v(1-olx:snx+olx,1-oly:sny+oly)
      double precision addstar(1-olx:snx+olx,1-oly:sny+oly)
      double precision adhdiv(1-olx:snx+olx,1-oly:sny+oly)
      double precision adke(1-olx:snx+olx,1-oly:sny+oly)
      double precision adomega3(1-olx:snx+olx,1-oly:sny+oly)
      double precision adstrain(1-olx:snx+olx,1-oly:sny+oly)
      double precision adtension(1-olx:snx+olx,1-oly:sny+oly)
      double precision aducf(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advcf(1-olx:snx+olx,1-oly:sny+oly)
      double precision advf(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision advort3(1-olx:snx+olx,1-oly:sny+oly)
      double precision advrf(1-olx:snx+olx,1-oly:sny+oly)
      double precision adzstar(1-olx:snx+olx,1-oly:sny+oly)
      double precision ardudrfac
      double precision ardvdrfac
      logical biharmonic
      logical bottomdragterms
      double precision del2u(1-olx:snx+olx,1-oly:sny+oly)
      double precision del2v(1-olx:snx+olx,1-oly:sny+oly)
      double precision dstar(1-olx:snx+olx,1-oly:sny+oly)
      logical harmonic
      double precision hdiv(1-olx:snx+olx,1-oly:sny+oly)
      integer help_h
      integer help_i
      double precision hfacz(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer imomkey
      integer ip1
      integer ip2
      integer j
      double precision ke(1-olx:snx+olx,1-oly:sny+oly)
      integer max0
      integer max1
      integer max2
      integer max3
      double precision omega3(1-olx:snx+olx,1-oly:sny+oly)
      double precision r_hfacz(1-olx:snx+olx,1-oly:sny+oly)
      double precision sidemaskfac
      double precision strain(1-olx:snx+olx,1-oly:sny+oly)
      double precision tension(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      logical usevariableviscosity
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision vort3(1-olx:snx+olx,1-oly:sny+oly)
      double precision zstar(1-olx:snx+olx,1-oly:sny+oly)

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          addel2u(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          addel2v(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          addstar(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adhdiv(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adke(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adomega3(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adstrain(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adtension(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          aducf(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adufld(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advcf(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advf(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advfld(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advisca4_d(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advisca4_z(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adviscah_d(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adviscah_z(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advort3(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advrf(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adzstar(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      act0 = k-1
      max0 = nr
      act1 = bi-mybxlo(mythid)
      max1 = mybxhi(mythid)-mybxlo(mythid)+1
      act2 = bj-mybylo(mythid)
      max2 = mybyhi(mythid)-mybylo(mythid)+1
      act3 = mythid-1
      max3 = ntx*nty
      act4 = ikey_dynamics-1
      imomkey = act0+1+act1*max0+act2*max0*max1+act3*max0*max1*max2+
     $act4*max0*max1*max2*max3
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          del2u(i,j) = 0.
          del2v(i,j) = 0.
          dstar(i,j) = 0.
          zstar(i,j) = 0.
          vort3(i,j) = 0.
          omega3(i,j) = 0.
          viscah_z(i,j) = 0.
          visca4_z(i,j) = 0.
          strain(i,j) = 0.d0
        end do
      end do
      ardudrfac = vffacmom*1.
      ardvdrfac = vffacmom*1.
      if (no_slip_sides) then
        sidemaskfac = sidedragfactor
      else
        sidemaskfac = 0.d0
      endif
      if (no_slip_bottom .or. bottomdragquadratic .ne. 0. .or. 
     $bottomdraglinear .ne. 0.) then
        bottomdragterms =  .true. 
      else
        bottomdragterms =  .false. 
      endif
      call mom_calc_hfacz( bi,bj,k,hfacz,r_hfacz,mythid )
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          ufld(i,j) = uvel(i,j,k,bi,bj)
          vfld(i,j) = vvel(i,j,k,bi,bj)
        end do
      end do
      call mom_calc_ke( bi,bj,k,selectkescheme,ufld,vfld,ke,mythid )
      call mom_calc_relvort3( bi,bj,k,ufld,vfld,hfacz,vort3,mythid )
      if (momviscosity) then
        call mom_calc_hdiv( bi,bj,k,2,ufld,vfld,hdiv,mythid )
        call mom_calc_tension( bi,bj,k,ufld,vfld,tension,mythid )
        call mom_calc_strain( bi,bj,k,ufld,vfld,hfacz,strain,mythid )
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            if (hfacz(i,j) .eq. 0.) then
              vort3(i,j) = sidemaskfac*vort3(i,j)
              strain(i,j) = sidemaskfac*strain(i,j)
            endif
          end do
        end do
        call mom_calc_visc( bi,bj,k,viscah_z,viscah_d,visca4_z,visca4_d,
     $harmonic,biharmonic,usevariableviscosity,hdiv,vort3,tension,
     $strain,ke,hfacz,mythid )
        if (biharmonic) then
          call mom_vi_del2uv( bi,bj,k,hdiv,vort3,hfacz,del2u,del2v,
     $mythid )
        endif
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          if (hfacz(i,j) .eq. 0.) then
            vort3(i,j) = 0.
          endif
        end do
      end do
      if (useabsvorticity) then
        call mom_calc_absvort3( bi,bj,k,vort3,omega3,mythid )
      endif
      do j = jmin, jmax
        do i = imin, imax
          adgv(i,j,k,bi,bj) = adgv(i,j,k,bi,bj)*masks(i,j,k,bi,bj)
          adgu(i,j,k,bi,bj) = adgu(i,j,k,bi,bj)*maskw(i,j,k,bi,bj)
        end do
      end do
      if (usenhmterms) then
        do j = jmin, jmax
          do i = imin, imax
            advcf(i,j) = advcf(i,j)+adgv(i,j,k,bi,bj)
          end do
        end do
        call admom_v_metric_nh( bi,bj,k,vfld,advfld,wvel,adwvel,advcf )
        do j = jmin, jmax
          do i = imin, imax
            aducf(i,j) = aducf(i,j)+adgu(i,j,k,bi,bj)
          end do
        end do
        call admom_u_metric_nh( bi,bj,k,ufld,adufld,wvel,adwvel,aducf )
      endif
      if (use3dcoriolis) then
        if (usingcurvilineargrid) then
          do j = jmin, jmax
            do i = imin, imax
              advcf(i,j) = advcf(i,j)+adgv(i,j,k,bi,bj)
            end do
          end do
          call admom_v_coriolis_nh( bi,bj,k,adwvel,advcf )
        endif
        do j = jmin, jmax
          do i = imin, imax
            aducf(i,j) = aducf(i,j)+adgu(i,j,k,bi,bj)
          end do
        end do
        call admom_u_coriolis_nh( bi,bj,k,adwvel,aducf )
      endif
      if (momadvection) then
        do j = jmin, jmax
          do i = imin, imax
            advcf(i,j) = advcf(i,j)+adgv(i,j,k,bi,bj)
          end do
        end do
        call admom_vi_v_grad_ke( bi,bj,k,adke,advcf )
        do j = jmin, jmax
          do i = imin, imax
            aducf(i,j) = aducf(i,j)+adgu(i,j,k,bi,bj)
          end do
        end do
        call admom_vi_u_grad_ke( bi,bj,k,adke,aducf )
        if ( .not. momimplvertadv) then
          do j = jmin, jmax
            do i = imin, imax
              advcf(i,j) = advcf(i,j)+adgv(i,j,k,bi,bj)
            end do
          end do
          call admom_vi_v_vertshear( bi,bj,k,vvel,advvel,wvel,adwvel,
     $advcf )
          do j = jmin, jmax
            do i = imin, imax
              aducf(i,j) = aducf(i,j)+adgu(i,j,k,bi,bj)
            end do
          end do
          call admom_vi_u_vertshear( bi,bj,k,uvel,aduvel,wvel,adwvel,
     $aducf )
        endif
        do j = jmin, jmax
          do i = imin, imax
            advcf(i,j) = advcf(i,j)+adgv(i,j,k,bi,bj)
          end do
        end do
        if ((highordervorticity .or. upwindvorticity) .and. 
     $useabsvorticity) then
          call admom_vi_v_coriolis_c4( bi,bj,k,ufld,adufld,omega3,
     $adomega3,r_hfacz,advcf )
        else if (highordervorticity .or. upwindvorticity) then
          call admom_vi_v_coriolis_c4( bi,bj,k,ufld,adufld,vort3,
     $advort3,r_hfacz,advcf )
        else if (useabsvorticity) then
          call admom_vi_v_coriolis( bi,bj,k,ufld,adufld,omega3,adomega3,
     $hfacz,r_hfacz,advcf )
        else
          call admom_vi_v_coriolis( bi,bj,k,ufld,adufld,vort3,advort3,
     $hfacz,r_hfacz,advcf )
        endif
        do j = jmin, jmax
          do i = imin, imax
            aducf(i,j) = aducf(i,j)+adgu(i,j,k,bi,bj)
          end do
        end do
        if ((highordervorticity .or. upwindvorticity) .and. 
     $useabsvorticity) then
          call admom_vi_u_coriolis_c4( bi,bj,k,vfld,advfld,omega3,
     $adomega3,r_hfacz,aducf )
        else if (highordervorticity .or. upwindvorticity) then
          call admom_vi_u_coriolis_c4( bi,bj,k,vfld,advfld,vort3,
     $advort3,r_hfacz,aducf )
        else if (useabsvorticity) then
          call admom_vi_u_coriolis( bi,bj,k,vfld,advfld,omega3,adomega3,
     $hfacz,r_hfacz,aducf )
        else
          call admom_vi_u_coriolis( bi,bj,k,vfld,advfld,vort3,advort3,
     $hfacz,r_hfacz,aducf )
        endif
      endif
      if (usecoriolis .and. ( .not. (usecdscheme .or. useabsvorticity 
     $.and. momadvection))) then
        do j = jmin, jmax
          do i = imin, imax
            advcf(i,j) = advcf(i,j)+adgv(i,j,k,bi,bj)
            adgv(i,j,k,bi,bj) = 0.d0
            aducf(i,j) = aducf(i,j)+adgu(i,j,k,bi,bj)
            adgu(i,j,k,bi,bj) = 0.d0
          end do
        end do
        if (useabsvorticity) then
          call admom_vi_v_coriolis( bi,bj,k,ufld,adufld,omega3,adomega3,
     $hfacz,r_hfacz,advcf )
          call admom_vi_u_coriolis( bi,bj,k,vfld,advfld,omega3,adomega3,
     $hfacz,r_hfacz,aducf )
        else
          call admom_vi_coriolis( bi,bj,k,adufld,advfld,aducf,advcf )
        endif
      else
        do j = jmin, jmax
          do i = imin, imax
            adgv(i,j,k,bi,bj) = 0.d0
            adgu(i,j,k,bi,bj) = 0.d0
          end do
        end do
      endif
      if (useabsvorticity) then
        call admom_calc_absvort3( advort3,adomega3 )
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          if (hfacz(i,j) .eq. 0.) then
            advort3(i,j) = 0.d0
          endif
        end do
      end do
      if (momviscosity .and. bottomdragterms) then
        do j = jmin, jmax
          do i = imin, imax
            advf(i,j) = advf(i,j)+adgvdiss(i,j)
          end do
        end do
        call admom_v_bottomdrag( bi,bj,k,vfld,advfld,ke,adke,kapparv,
     $advf )
      endif
      if (momviscosity .and. no_slip_sides) then
        do j = jmin, jmax
          do i = imin, imax
            advf(i,j) = advf(i,j)+adgvdiss(i,j)
          end do
        end do
        call admom_v_sidedrag( bi,bj,k,vfld,advfld,del2v,addel2v,hfacz,
     $viscah_z,adviscah_z,visca4_z,advisca4_z,advf )
      endif
      if (momviscosity .and. ( .not. implicitviscosity)) then
        help_i = k+1
        do j = jmin, jmax
          do i = imin, imax
            adfverv(i,j,kdown) = adfverv(i,j,kdown)-adgvdiss(i,j)*
     $recip_hfacs(i,j,k,bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*rksign
            adfverv(i,j,kup) = adfverv(i,j,kup)+adgvdiss(i,j)*
     $recip_hfacs(i,j,k,bi,bj)*recip_drf(k)*recip_ras(i,j,bi,bj)*rksign
          end do
        end do
        do j = jmin, jmax
          do i = imin, imax
            advrf(i,j) = advrf(i,j)+adfverv(i,j,kdown)*ardvdrfac
            adfverv(i,j,kdown) = 0.d0
          end do
        end do
        call admom_v_rviscflux( bi,bj,help_i,advvel,kapparv,advrf )
      endif
      if (momviscosity .and. bottomdragterms) then
        do j = jmin, jmax
          do i = imin, imax
            advf(i,j) = advf(i,j)+adgudiss(i,j)
          end do
        end do
        call admom_u_bottomdrag( bi,bj,k,ufld,adufld,ke,adke,kapparu,
     $advf )
      endif
      if (momviscosity .and. no_slip_sides) then
        do j = jmin, jmax
          do i = imin, imax
            advf(i,j) = advf(i,j)+adgudiss(i,j)
          end do
        end do
        call admom_u_sidedrag( bi,bj,k,ufld,adufld,del2u,addel2u,hfacz,
     $viscah_z,adviscah_z,visca4_z,advisca4_z,advf )
      endif
      if (momviscosity .and. ( .not. implicitviscosity)) then
        help_h = k+1
        do j = 2-oly, sny+oly-1
          do i = 2-olx, snx+olx-1
            adfveru(i,j,kdown) = adfveru(i,j,kdown)-adgudiss(i,j)*
     $recip_hfacw(i,j,k,bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*rksign
            adfveru(i,j,kup) = adfveru(i,j,kup)+adgudiss(i,j)*
     $recip_hfacw(i,j,k,bi,bj)*recip_drf(k)*recip_raw(i,j,bi,bj)*rksign
          end do
        end do
        do j = jmin, jmax
          do i = imin, imax
            advrf(i,j) = advrf(i,j)+adfveru(i,j,kdown)*ardudrfac
            adfveru(i,j,kdown) = 0.d0
          end do
        end do
        call admom_u_rviscflux( bi,bj,help_h,aduvel,kapparu,advrf )
      endif
      if (momviscosity) then
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            vort3(ip1,ip2) = comlev1_bibj_k_vort3_38h(ip1,ip2,imomkey)
          end do
        end do
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            if (hfacz(i,j) .eq. 0.) then
              vort3(i,j) = sidemaskfac*vort3(i,j)
            endif
          end do
        end do
        if (biharmonic) then
          call mom_calc_hdiv( bi,bj,k,2,del2u,del2v,dstar,mythid )
          call mom_calc_relvort3( bi,bj,k,del2u,del2v,hfacz,zstar,
     $mythid )
        endif
        if (usestraintensionvisc) then
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              if (hfacz(i,j) .eq. 0.) then
                strain(i,j) = 0.d0
              endif
            end do
          end do
          call admom_hdissip( bi,bj,tension,adtension,strain,adstrain,
     $viscah_z,adviscah_z,viscah_d,adviscah_d,harmonic,adgudiss,
     $adgvdiss )
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              if (hfacz(i,j) .eq. 0.) then
                adstrain(i,j) = 0.d0
              endif
            end do
          end do
        else
          call admom_vi_hdissip( bi,bj,k,hdiv,adhdiv,vort3,advort3,
     $hfacz,dstar,addstar,zstar,adzstar,viscah_z,adviscah_z,viscah_d,
     $adviscah_d,visca4_z,advisca4_z,visca4_d,advisca4_d,harmonic,
     $biharmonic,usevariableviscosity,adgudiss,adgvdiss )
        endif
        if (biharmonic) then
          call admom_calc_relvort3( bi,bj,addel2u,addel2v,adzstar )
          call admom_calc_hdiv( bi,bj,k,2,addel2u,addel2v,addstar )
          call admom_vi_del2uv( bi,bj,k,adhdiv,advort3,hfacz,addel2u,
     $addel2v )
        endif
        call mom_calc_hdiv( bi,bj,k,2,ufld,vfld,hdiv,mythid )
        call mom_calc_strain( bi,bj,k,ufld,vfld,hfacz,strain,mythid )
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            if (hfacz(i,j) .eq. 0.) then
              strain(i,j) = sidemaskfac*strain(i,j)
            endif
          end do
        end do
        call admom_calc_visc( bi,bj,k,adviscah_z,adviscah_d,advisca4_z,
     $advisca4_d,hdiv,adhdiv,vort3,advort3,tension,adtension,strain,
     $adstrain,ke,adke,mythid )
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            if (hfacz(i,j) .eq. 0.) then
              adstrain(i,j) = adstrain(i,j)*sidemaskfac
              advort3(i,j) = advort3(i,j)*sidemaskfac
            endif
          end do
        end do
        call admom_calc_strain( bi,bj,adufld,advfld,adstrain )
        call admom_calc_tension( bi,bj,adufld,advfld,adtension )
        call admom_calc_hdiv( bi,bj,k,2,adufld,advfld,adhdiv )
      endif
      call admom_calc_relvort3( bi,bj,adufld,advfld,advort3 )
      call admom_calc_ke( bi,bj,k,selectkescheme,ufld,adufld,vfld,
     $advfld,adke )
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          advvel(i,j,k,bi,bj) = advvel(i,j,k,bi,bj)+advfld(i,j)
          advfld(i,j) = 0.d0
          aduvel(i,j,k,bi,bj) = aduvel(i,j,k,bi,bj)+adufld(i,j)
          adufld(i,j) = 0.d0
        end do
      end do
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          adgvdiss(i,j) = 0.d0
          adgudiss(i,j) = 0.d0
        end do
      end do

      end

      subroutine mdmom_vecinv( bi, bj, imin, imax, jmin, jmax, k, kup, 
     $kdown, kapparu, kapparv, fveru, fverv, gudiss, gvdiss, mytime, 
     $myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      real*8 comlev1_bibj_k_vort3_38h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadvort3/ comlev1_bibj_k_vort3_38h

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      integer bi
      integer bj
      double precision fveru(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision fverv(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision gudiss(1-olx:snx+olx,1-oly:sny+oly)
      double precision gvdiss(1-olx:snx+olx,1-oly:sny+oly)
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k
      double precision kapparu(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision kapparv(1-olx:snx+olx,1-oly:sny+oly,nr)
      integer kdown
      integer kup
      integer myiter
      integer mythid
      double precision mytime

C==============================================
C declare local variables
C==============================================
      integer act0
      integer act1
      integer act2
      integer act3
      integer act4
      double precision ardudrfac
      double precision ardvdrfac
      logical biharmonic
      logical bottomdragterms
      double precision del2u(1-olx:snx+olx,1-oly:sny+oly)
      double precision del2v(1-olx:snx+olx,1-oly:sny+oly)
      double precision dstar(1-olx:snx+olx,1-oly:sny+oly)
      logical harmonic
      double precision hdiv(1-olx:snx+olx,1-oly:sny+oly)
      integer help_h
      integer help_i
      double precision hfacz(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer imomkey
      integer iqa
      integer iqb
      integer j
      double precision ke(1-olx:snx+olx,1-oly:sny+oly)
      integer max0
      integer max1
      integer max2
      integer max3
      double precision omega3(1-olx:snx+olx,1-oly:sny+oly)
      double precision r_hfacz(1-olx:snx+olx,1-oly:sny+oly)
      double precision sidemaskfac
      double precision strain(1-olx:snx+olx,1-oly:sny+oly)
      double precision tension(1-olx:snx+olx,1-oly:sny+oly)
      double precision ucf(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      logical usevariableviscosity
      double precision vcf(1-olx:snx+olx,1-oly:sny+oly)
      double precision vf(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision vort3(1-olx:snx+olx,1-oly:sny+oly)
      double precision vrf(1-olx:snx+olx,1-oly:sny+oly)
      double precision zstar(1-olx:snx+olx,1-oly:sny+oly)

C**********************************************
C executable statements of routine
C**********************************************
      fveru(1,1,kup) = fveru(1,1,kup)
      fverv(1,1,kup) = fverv(1,1,kup)
      act0 = k-1
      max0 = nr
      act1 = bi-mybxlo(mythid)
      max1 = mybxhi(mythid)-mybxlo(mythid)+1
      act2 = bj-mybylo(mythid)
      max2 = mybyhi(mythid)-mybylo(mythid)+1
      act3 = mythid-1
      max3 = ntx*nty
      act4 = ikey_dynamics-1
      imomkey = act0+1+act1*max0+act2*max0*max1+act3*max0*max1*max2+
     $act4*max0*max1*max2*max3
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          vf(i,j) = 0.
          vrf(i,j) = 0.
          ucf(i,j) = 0.
          vcf(i,j) = 0.
          del2u(i,j) = 0.
          del2v(i,j) = 0.
          dstar(i,j) = 0.
          zstar(i,j) = 0.
          gudiss(i,j) = 0.
          gvdiss(i,j) = 0.
          vort3(i,j) = 0.
          omega3(i,j) = 0.
          hdiv(i,j) = 0.
          viscah_z(i,j) = 0.
          viscah_d(i,j) = 0.
          visca4_z(i,j) = 0.
          visca4_d(i,j) = 0.
          strain(i,j) = 0.d0
          tension(i,j) = 0.d0
        end do
      end do
      ardudrfac = vffacmom*1.
      ardvdrfac = vffacmom*1.
      if (no_slip_sides) then
        sidemaskfac = sidedragfactor
      else
        sidemaskfac = 0.d0
      endif
      if (no_slip_bottom .or. bottomdragquadratic .ne. 0. .or. 
     $bottomdraglinear .ne. 0.) then
        bottomdragterms =  .true. 
      else
        bottomdragterms =  .false. 
      endif
      call mom_calc_hfacz( bi,bj,k,hfacz,r_hfacz,mythid )
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          ufld(i,j) = uvel(i,j,k,bi,bj)
          vfld(i,j) = vvel(i,j,k,bi,bj)
        end do
      end do
      call mom_calc_ke( bi,bj,k,selectkescheme,ufld,vfld,ke,mythid )
      call mom_calc_relvort3( bi,bj,k,ufld,vfld,hfacz,vort3,mythid )
      if (momviscosity) then
        do iqb = 1-oly, sny+oly
          do iqa = 1-olx, snx+olx
            comlev1_bibj_k_vort3_38h(iqa,iqb,imomkey) = vort3(iqa,iqb)
          end do
        end do
        call mom_calc_hdiv( bi,bj,k,2,ufld,vfld,hdiv,mythid )
        call mom_calc_tension( bi,bj,k,ufld,vfld,tension,mythid )
        call mom_calc_strain( bi,bj,k,ufld,vfld,hfacz,strain,mythid )
        do j = 1-oly, sny+oly
          do i = 1-olx, snx+olx
            if (hfacz(i,j) .eq. 0.) then
              vort3(i,j) = sidemaskfac*vort3(i,j)
              strain(i,j) = sidemaskfac*strain(i,j)
            endif
          end do
        end do
        call mdmom_calc_visc( bi,bj,k,viscah_z,viscah_d,visca4_z,
     $visca4_d,harmonic,biharmonic,usevariableviscosity,hdiv,vort3,
     $tension,strain,ke,hfacz,mythid )
        if (biharmonic) then
          call mom_vi_del2uv( bi,bj,k,hdiv,vort3,hfacz,del2u,del2v,
     $mythid )
          call mom_calc_hdiv( bi,bj,k,2,del2u,del2v,dstar,mythid )
          call mom_calc_relvort3( bi,bj,k,del2u,del2v,hfacz,zstar,
     $mythid )
        endif
        if (usestraintensionvisc) then
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              if (hfacz(i,j) .eq. 0.) then
                strain(i,j) = 0.d0
              endif
            end do
          end do
          call mom_hdissip( bi,bj,k,hdiv,vort3,tension,strain,ke,hfacz,
     $viscah_z,viscah_d,visca4_z,visca4_d,harmonic,biharmonic,
     $usevariableviscosity,gudiss,gvdiss,mythid )
        else
          call mom_vi_hdissip( bi,bj,k,hdiv,vort3,tension,strain,ke,
     $hfacz,dstar,zstar,viscah_z,viscah_d,visca4_z,visca4_d,harmonic,
     $biharmonic,usevariableviscosity,gudiss,gvdiss,mythid )
        endif
      endif
      if (momviscosity .and. ( .not. implicitviscosity)) then
        help_h = k+1
        call mom_u_rviscflux( bi,bj,help_h,uvel,kapparu,vrf,mythid )
        do j = jmin, jmax
          do i = imin, imax
            fveru(i,j,kdown) = ardudrfac*vrf(i,j)
          end do
        end do
        do j = 2-oly, sny+oly-1
          do i = 2-olx, snx+olx-1
            gudiss(i,j) = gudiss(i,j)-recip_hfacw(i,j,k,bi,bj)*
     $recip_drf(k)*recip_raw(i,j,bi,bj)*(fveru(i,j,kdown)-fveru(i,j,kup)
     $)*rksign
          end do
        end do
      endif
      if (momviscosity .and. no_slip_sides) then
        call mom_u_sidedrag( bi,bj,k,ufld,del2u,hfacz,viscah_z,visca4_z,
     $harmonic,biharmonic,usevariableviscosity,vf,mythid )
        do j = jmin, jmax
          do i = imin, imax
            gudiss(i,j) = gudiss(i,j)+vf(i,j)
          end do
        end do
      endif
      if (momviscosity .and. bottomdragterms) then
        call mom_u_bottomdrag( bi,bj,k,ufld,ke,kapparu,vf,mythid )
        do j = jmin, jmax
          do i = imin, imax
            gudiss(i,j) = gudiss(i,j)+vf(i,j)
          end do
        end do
      endif
      if (momviscosity .and. ( .not. implicitviscosity)) then
        help_i = k+1
        call mom_v_rviscflux( bi,bj,help_i,vvel,kapparv,vrf,mythid )
        do j = jmin, jmax
          do i = imin, imax
            fverv(i,j,kdown) = ardvdrfac*vrf(i,j)
          end do
        end do
        do j = jmin, jmax
          do i = imin, imax
            gvdiss(i,j) = gvdiss(i,j)-recip_hfacs(i,j,k,bi,bj)*
     $recip_drf(k)*recip_ras(i,j,bi,bj)*(fverv(i,j,kdown)-fverv(i,j,kup)
     $)*rksign
          end do
        end do
      endif
      if (momviscosity .and. no_slip_sides) then
        call mom_v_sidedrag( bi,bj,k,vfld,del2v,hfacz,viscah_z,visca4_z,
     $harmonic,biharmonic,usevariableviscosity,vf,mythid )
        do j = jmin, jmax
          do i = imin, imax
            gvdiss(i,j) = gvdiss(i,j)+vf(i,j)
          end do
        end do
      endif
      if (momviscosity .and. bottomdragterms) then
        call mom_v_bottomdrag( bi,bj,k,vfld,ke,kapparv,vf,mythid )
        do j = jmin, jmax
          do i = imin, imax
            gvdiss(i,j) = gvdiss(i,j)+vf(i,j)
          end do
        end do
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          if (hfacz(i,j) .eq. 0.) then
            vort3(i,j) = 0.
          endif
        end do
      end do
      if (useabsvorticity) then
        call mom_calc_absvort3( bi,bj,k,vort3,omega3,mythid )
      endif
      if (usecoriolis .and. ( .not. (usecdscheme .or. useabsvorticity 
     $.and. momadvection))) then
        if (useabsvorticity) then
          call mom_vi_u_coriolis( bi,bj,k,vfld,omega3,hfacz,r_hfacz,ucf,
     $mythid )
          call mom_vi_v_coriolis( bi,bj,k,ufld,omega3,hfacz,r_hfacz,vcf,
     $mythid )
        else
          call mom_vi_coriolis( bi,bj,k,ufld,vfld,hfacz,r_hfacz,ucf,vcf,
     $mythid )
        endif
        do j = jmin, jmax
          do i = imin, imax
            gu(i,j,k,bi,bj) = ucf(i,j)
            gv(i,j,k,bi,bj) = vcf(i,j)
          end do
        end do
      else
        do j = jmin, jmax
          do i = imin, imax
            gu(i,j,k,bi,bj) = 0.d0
            gv(i,j,k,bi,bj) = 0.d0
          end do
        end do
      endif
      if (momadvection) then
        if ((highordervorticity .or. upwindvorticity) .and. 
     $useabsvorticity) then
          call mom_vi_u_coriolis_c4( bi,bj,k,vfld,omega3,r_hfacz,ucf,
     $mythid )
        else if (highordervorticity .or. upwindvorticity) then
          call mom_vi_u_coriolis_c4( bi,bj,k,vfld,vort3,r_hfacz,ucf,
     $mythid )
        else if (useabsvorticity) then
          call mom_vi_u_coriolis( bi,bj,k,vfld,omega3,hfacz,r_hfacz,ucf,
     $mythid )
        else
          call mom_vi_u_coriolis( bi,bj,k,vfld,vort3,hfacz,r_hfacz,ucf,
     $mythid )
        endif
        do j = jmin, jmax
          do i = imin, imax
            gu(i,j,k,bi,bj) = gu(i,j,k,bi,bj)+ucf(i,j)
          end do
        end do
        if ((highordervorticity .or. upwindvorticity) .and. 
     $useabsvorticity) then
          call mom_vi_v_coriolis_c4( bi,bj,k,ufld,omega3,r_hfacz,vcf,
     $mythid )
        else if (highordervorticity .or. upwindvorticity) then
          call mom_vi_v_coriolis_c4( bi,bj,k,ufld,vort3,r_hfacz,vcf,
     $mythid )
        else if (useabsvorticity) then
          call mom_vi_v_coriolis( bi,bj,k,ufld,omega3,hfacz,r_hfacz,vcf,
     $mythid )
        else
          call mom_vi_v_coriolis( bi,bj,k,ufld,vort3,hfacz,r_hfacz,vcf,
     $mythid )
        endif
        do j = jmin, jmax
          do i = imin, imax
            gv(i,j,k,bi,bj) = gv(i,j,k,bi,bj)+vcf(i,j)
          end do
        end do
        if ( .not. momimplvertadv) then
          call mom_vi_u_vertshear( bi,bj,k,uvel,wvel,ucf,mythid )
          do j = jmin, jmax
            do i = imin, imax
              gu(i,j,k,bi,bj) = gu(i,j,k,bi,bj)+ucf(i,j)
            end do
          end do
          call mom_vi_v_vertshear( bi,bj,k,vvel,wvel,vcf,mythid )
          do j = jmin, jmax
            do i = imin, imax
              gv(i,j,k,bi,bj) = gv(i,j,k,bi,bj)+vcf(i,j)
            end do
          end do
        endif
        call mom_vi_u_grad_ke( bi,bj,k,ke,ucf,mythid )
        do j = jmin, jmax
          do i = imin, imax
            gu(i,j,k,bi,bj) = gu(i,j,k,bi,bj)+ucf(i,j)
          end do
        end do
        call mom_vi_v_grad_ke( bi,bj,k,ke,vcf,mythid )
        do j = jmin, jmax
          do i = imin, imax
            gv(i,j,k,bi,bj) = gv(i,j,k,bi,bj)+vcf(i,j)
          end do
        end do
      endif
      if (use3dcoriolis) then
        call mom_u_coriolis_nh( bi,bj,k,wvel,ucf,mythid )
        do j = jmin, jmax
          do i = imin, imax
            gu(i,j,k,bi,bj) = gu(i,j,k,bi,bj)+ucf(i,j)
          end do
        end do
        if (usingcurvilineargrid) then
          call mom_v_coriolis_nh( bi,bj,k,wvel,vcf,mythid )
          do j = jmin, jmax
            do i = imin, imax
              gv(i,j,k,bi,bj) = gv(i,j,k,bi,bj)+vcf(i,j)
            end do
          end do
        endif
      endif
      if (usenhmterms) then
        call mom_u_metric_nh( bi,bj,k,ufld,wvel,ucf,mythid )
        do j = jmin, jmax
          do i = imin, imax
            gu(i,j,k,bi,bj) = gu(i,j,k,bi,bj)+ucf(i,j)
          end do
        end do
        call mom_v_metric_nh( bi,bj,k,vfld,wvel,vcf,mythid )
        do j = jmin, jmax
          do i = imin, imax
            gv(i,j,k,bi,bj) = gv(i,j,k,bi,bj)+vcf(i,j)
          end do
        end do
      endif
      do j = jmin, jmax
        do i = imin, imax
          gu(i,j,k,bi,bj) = gu(i,j,k,bi,bj)*maskw(i,j,k,bi,bj)
          gv(i,j,k,bi,bj) = gv(i,j,k,bi,bj)*masks(i,j,k,bi,bj)
        end do
      end do
      end

      subroutine admom_vi_coriolis( bi, bj, k, adufld, advfld, 
     $aducoriolisterm, advcoriolisterm )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

C==============================================
C declare arguments
C==============================================
      double precision aducoriolisterm(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advcoriolisterm(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k

C==============================================
C declare local variables
C==============================================
      double precision adubarxy
      double precision advbarxy
      double precision epsil
      integer i
      integer j
      double precision ubarxyh
      double precision vbarxyh

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adubarxy = 0.d0
      advbarxy = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      epsil = 1.d-9
      if (usejamartwetpoints) then
        do j = sny+oly, 2-oly, -1
          adubarxy = 0.d0
          do i = snx+olx-1, 1-olx, -1
            adubarxy = 0.d0
            adubarxy = adubarxy-0.5*advcoriolisterm(i,j)*(fcorig(i,j,bi,
     $bj)+fcorig(i+1,j,bi,bj))*recip_dyc(i,j,bi,bj)*masks(i,j,k,bi,bj)
            advcoriolisterm(i,j) = 0.d0
            ubarxyh = max(epsil,hfacw(i,j,k,bi,bj)+hfacw(i,j-1,k,bi,bj)+
     $hfacw(i+1,j,k,bi,bj)+hfacw(i+1,j-1,k,bi,bj))
            adufld(i+1,j-1) = adufld(i+1,j-1)+adubarxy*(dyg(i+1,j-1,bi,
     $bj)*hfacw(i+1,j-1,k,bi,bj)/ubarxyh)
            adufld(i,j-1) = adufld(i,j-1)+adubarxy*(dyg(i,j-1,bi,bj)*
     $hfacw(i,j-1,k,bi,bj)/ubarxyh)
            adufld(i+1,j) = adufld(i+1,j)+adubarxy*(dyg(i+1,j,bi,bj)*
     $hfacw(i+1,j,k,bi,bj)/ubarxyh)
            adufld(i,j) = adufld(i,j)+adubarxy*(dyg(i,j,bi,bj)*hfacw(i,
     $j,k,bi,bj)/ubarxyh)
            adubarxy = 0.d0
          end do
        end do
      else
        do j = sny+oly, 2-oly, -1
          adubarxy = 0.d0
          do i = snx+olx-1, 1-olx, -1
            adubarxy = 0.d0
            adubarxy = adubarxy-0.5*advcoriolisterm(i,j)*(fcorig(i,j,bi,
     $bj)+fcorig(i+1,j,bi,bj))*recip_dyc(i,j,bi,bj)*masks(i,j,k,bi,bj)
            advcoriolisterm(i,j) = 0.d0
            adufld(i+1,j-1) = adufld(i+1,j-1)+0.25*adubarxy*dyg(i+1,j-1,
     $bi,bj)
            adufld(i,j-1) = adufld(i,j-1)+0.25*adubarxy*dyg(i,j-1,bi,bj)
            adufld(i+1,j) = adufld(i+1,j)+0.25*adubarxy*dyg(i+1,j,bi,bj)
            adufld(i,j) = adufld(i,j)+0.25*adubarxy*dyg(i,j,bi,bj)
            adubarxy = 0.d0
          end do
        end do
      endif
      if (usejamartwetpoints) then
        do j = sny+oly-1, 1-oly, -1
          advbarxy = 0.d0
          do i = snx+olx, 2-olx, -1
            advbarxy = 0.d0
            advbarxy = advbarxy+0.5*aducoriolisterm(i,j)*(fcorig(i,j,bi,
     $bj)+fcorig(i,j+1,bi,bj))*recip_dxc(i,j,bi,bj)*maskw(i,j,k,bi,bj)
            aducoriolisterm(i,j) = 0.d0
            vbarxyh = max(epsil,hfacs(i,j,k,bi,bj)+hfacs(i-1,j,k,bi,bj)+
     $hfacs(i,j+1,k,bi,bj)+hfacs(i-1,j+1,k,bi,bj))
            advfld(i-1,j+1) = advfld(i-1,j+1)+advbarxy*(dxg(i-1,j+1,bi,
     $bj)*hfacs(i-1,j+1,k,bi,bj)/vbarxyh)
            advfld(i,j+1) = advfld(i,j+1)+advbarxy*(dxg(i,j+1,bi,bj)*
     $hfacs(i,j+1,k,bi,bj)/vbarxyh)
            advfld(i-1,j) = advfld(i-1,j)+advbarxy*(dxg(i-1,j,bi,bj)*
     $hfacs(i-1,j,k,bi,bj)/vbarxyh)
            advfld(i,j) = advfld(i,j)+advbarxy*(dxg(i,j,bi,bj)*hfacs(i,
     $j,k,bi,bj)/vbarxyh)
            advbarxy = 0.d0
          end do
        end do
      else
        do j = sny+oly-1, 1-oly, -1
          advbarxy = 0.d0
          do i = snx+olx, 2-olx, -1
            advbarxy = 0.d0
            advbarxy = advbarxy+0.5*aducoriolisterm(i,j)*(fcorig(i,j,bi,
     $bj)+fcorig(i,j+1,bi,bj))*recip_dxc(i,j,bi,bj)*maskw(i,j,k,bi,bj)
            aducoriolisterm(i,j) = 0.d0
            advfld(i-1,j+1) = advfld(i-1,j+1)+0.25*advbarxy*dxg(i-1,j+1,
     $bi,bj)
            advfld(i,j+1) = advfld(i,j+1)+0.25*advbarxy*dxg(i,j+1,bi,bj)
            advfld(i-1,j) = advfld(i-1,j)+0.25*advbarxy*dxg(i-1,j,bi,bj)
            advfld(i,j) = advfld(i,j)+0.25*advbarxy*dxg(i,j,bi,bj)
            advbarxy = 0.d0
          end do
        end do
      endif

      end

      subroutine admom_vi_del2uv( bi, bj, k, adhdiv, advort3, hfacz, 
     $addel2u, addel2v )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision addel2u(1-olx:snx+olx,1-oly:sny+oly)
      double precision addel2v(1-olx:snx+olx,1-oly:sny+oly)
      double precision adhdiv(1-olx:snx+olx,1-oly:sny+oly)
      double precision advort3(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision hfacz(1-olx:snx+olx,1-oly:sny+oly)
      integer k

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 2-oly, sny+oly-1
        do i = 2-olx, snx+olx-1
          adhdiv(i,j-1) = adhdiv(i,j-1)-addel2v(i,j)*recip_dyc(i,j,bi,
     $bj)
          adhdiv(i,j) = adhdiv(i,j)+addel2v(i,j)*recip_dyc(i,j,bi,bj)
          advort3(i+1,j) = advort3(i+1,j)+addel2v(i,j)*recip_hfacs(i,j,
     $k,bi,bj)*hfacz(i+1,j)*recip_dxg(i,j,bi,bj)
          advort3(i,j) = advort3(i,j)-addel2v(i,j)*recip_hfacs(i,j,k,bi,
     $bj)*hfacz(i,j)*recip_dxg(i,j,bi,bj)
          addel2v(i,j) = 0.d0
        end do
      end do
      if (usecubedsphereexchange) then
        call adfill_cs_corner_tr_rl( 2, .false. ,adhdiv )
      endif
      do j = 2-oly, sny+oly-1
        do i = 2-olx, snx+olx-1
          adhdiv(i-1,j) = adhdiv(i-1,j)-addel2u(i,j)*recip_dxc(i,j,bi,
     $bj)
          adhdiv(i,j) = adhdiv(i,j)+addel2u(i,j)*recip_dxc(i,j,bi,bj)
          advort3(i,j+1) = advort3(i,j+1)-addel2u(i,j)*recip_hfacw(i,j,
     $k,bi,bj)*hfacz(i,j+1)*recip_dyg(i,j,bi,bj)
          advort3(i,j) = advort3(i,j)+addel2u(i,j)*recip_hfacw(i,j,k,bi,
     $bj)*hfacz(i,j)*recip_dyg(i,j,bi,bj)
          addel2u(i,j) = 0.d0
        end do
      end do
      if (usecubedsphereexchange) then
        call adfill_cs_corner_tr_rl( 1, .false. ,adhdiv )
      endif

      end

      subroutine admom_vi_hdissip( bi, bj, k, hdiv, adhdiv, vort3, 
     $advort3, hfacz, dstar, addstar, zstar, adzstar, viscah_z, 
     $adviscah_z, viscah_d, adviscah_d, visca4_z, advisca4_z, visca4_d, 
     $advisca4_d, harmonic, biharmonic, usevariableviscosity, adudissip,
     $ advdissip )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision addstar(1-olx:snx+olx,1-oly:sny+oly)
      double precision adhdiv(1-olx:snx+olx,1-oly:sny+oly)
      double precision adudissip(1-olx:snx+olx,1-oly:sny+oly)
      double precision advdissip(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision advisca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision adviscah_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision advort3(1-olx:snx+olx,1-oly:sny+oly)
      double precision adzstar(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      logical biharmonic
      integer bj
      double precision dstar(1-olx:snx+olx,1-oly:sny+oly)
      logical harmonic
      double precision hdiv(1-olx:snx+olx,1-oly:sny+oly)
      double precision hfacz(1-olx:snx+olx,1-oly:sny+oly)
      integer k
      logical usevariableviscosity
      double precision visca4_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision visca4_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_d(1-olx:snx+olx,1-oly:sny+oly)
      double precision viscah_z(1-olx:snx+olx,1-oly:sny+oly)
      double precision vort3(1-olx:snx+olx,1-oly:sny+oly)
      double precision zstar(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision addij
      double precision addim
      double precision addmj
      double precision adud2
      double precision adud4
      double precision advd2
      double precision advd4
      double precision adzij
      double precision adzij1
      double precision adzip
      double precision adzip1
      double precision adzpj
      double precision adzpj1
      double precision dij
      double precision dim
      double precision dmj
      integer i
      integer j
      double precision zij1
      double precision zip1
      double precision zpj1

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      addij = 0.d0
      addim = 0.d0
      addmj = 0.d0
      adud2 = 0.d0
      adud4 = 0.d0
      advd2 = 0.d0
      advd4 = 0.d0
      adzij = 0.d0
      adzij1 = 0.d0
      adzip = 0.d0
      adzip1 = 0.d0
      adzpj = 0.d0
      adzpj1 = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (biharmonic) then
        do j = sny+oly-1, 2-oly, -1
          do i = snx+olx-1, 2-olx, -1
            dim = dstar(i,j-1)
            dij = dstar(i,j)
            dmj = dstar(i-1,j)
            zip1 = hfacz(i,j+1)*zstar(i,j+1)
            zij1 = hfacz(i,j)*zstar(i,j)
            zpj1 = hfacz(i+1,j)*zstar(i+1,j)
            advd4 = advd4-advdissip(i,j)
            adud4 = adud4-adudissip(i,j)
            if (usevariableviscosity) then
              addij = addij+advd4*recip_dyc(i,j,bi,bj)
              addim = addim-advd4*recip_dyc(i,j,bi,bj)
              adzij = adzij-advd4*recip_hfacs(i,j,k,bi,bj)*recip_dxg(i,
     $j,bi,bj)*cosfacv(j,bi,bj)
              adzpj = adzpj+advd4*recip_hfacs(i,j,k,bi,bj)*recip_dxg(i,
     $j,bi,bj)*cosfacv(j,bi,bj)
              advd4 = 0.d0
              addij = addij+adud4*cosfacu(j,bi,bj)*recip_dxc(i,j,bi,bj)
              addmj = addmj-adud4*cosfacu(j,bi,bj)*recip_dxc(i,j,bi,bj)
              adzij = adzij+adud4*recip_hfacw(i,j,k,bi,bj)*recip_dyg(i,
     $j,bi,bj)
              adzip = adzip-adud4*recip_hfacw(i,j,k,bi,bj)*recip_dyg(i,
     $j,bi,bj)
              adud4 = 0.d0
              advisca4_z(i+1,j) = advisca4_z(i+1,j)+adzpj*zpj1
              adzpj1 = adzpj1+adzpj*visca4_z(i+1,j)
              adzpj = 0.d0
              advisca4_z(i,j+1) = advisca4_z(i,j+1)+adzip*zip1
              adzip1 = adzip1+adzip*visca4_z(i,j+1)
              adzip = 0.d0
              advisca4_z(i,j) = advisca4_z(i,j)+adzij*zij1
              adzij1 = adzij1+adzij*visca4_z(i,j)
              adzij = 0.d0
              advisca4_d(i-1,j) = advisca4_d(i-1,j)+addmj*dmj
              addmj = addmj*visca4_d(i-1,j)
              advisca4_d(i,j-1) = advisca4_d(i,j-1)+addim*dim
              addim = addim*visca4_d(i,j-1)
              advisca4_d(i,j) = advisca4_d(i,j)+addij*dij
              addij = addij*visca4_d(i,j)
            else
              addij = addij+advd4*visca4d*recip_dyc(i,j,bi,bj)
              addim = addim-advd4*visca4d*recip_dyc(i,j,bi,bj)
              adzij = adzij-advd4*visca4z*recip_hfacs(i,j,k,bi,bj)*
     $cosfacv(j,bi,bj)*recip_dxg(i,j,bi,bj)
              adzpj = adzpj+advd4*visca4z*recip_hfacs(i,j,k,bi,bj)*
     $cosfacv(j,bi,bj)*recip_dxg(i,j,bi,bj)
              advd4 = 0.d0
              addij = addij+adud4*visca4d*cosfacu(j,bi,bj)*recip_dxc(i,
     $j,bi,bj)
              addmj = addmj-adud4*visca4d*cosfacu(j,bi,bj)*recip_dxc(i,
     $j,bi,bj)
              adzij = adzij+adud4*visca4z*recip_hfacw(i,j,k,bi,bj)*
     $recip_dyg(i,j,bi,bj)
              adzip = adzip-adud4*visca4z*recip_hfacw(i,j,k,bi,bj)*
     $recip_dyg(i,j,bi,bj)
              adud4 = 0.d0
              adzpj1 = adzpj1+adzpj
              adzpj = 0.d0
              adzip1 = adzip1+adzip
              adzip = 0.d0
              adzij1 = adzij1+adzij
              adzij = 0.d0
            endif
            adzstar(i+1,j) = adzstar(i+1,j)+adzpj1*hfacz(i+1,j)
            adzpj1 = 0.d0
            adzstar(i,j) = adzstar(i,j)+adzij1*hfacz(i,j)
            adzij1 = 0.d0
            adzstar(i,j+1) = adzstar(i,j+1)+adzip1*hfacz(i,j+1)
            adzip1 = 0.d0
            addstar(i-1,j) = addstar(i-1,j)+addmj
            addmj = 0.d0
            addstar(i,j) = addstar(i,j)+addij
            addij = 0.d0
            addstar(i,j-1) = addstar(i,j-1)+addim
            addim = 0.d0
          end do
        end do
      endif
      if (harmonic) then
        do j = sny+oly-1, 2-oly, -1
          do i = snx+olx-1, 2-olx, -1
            advd2 = advd2+advdissip(i,j)
            advdissip(i,j) = 0.d0
            adud2 = adud2+adudissip(i,j)
            adudissip(i,j) = 0.d0
            if (usevariableviscosity) then
              addij = addij+advd2*recip_dyc(i,j,bi,bj)
              addim = addim-advd2*recip_dyc(i,j,bi,bj)
              adzij = adzij-advd2*recip_hfacs(i,j,k,bi,bj)*recip_dxg(i,
     $j,bi,bj)*cosfacv(j,bi,bj)
              adzpj = adzpj+advd2*recip_hfacs(i,j,k,bi,bj)*recip_dxg(i,
     $j,bi,bj)*cosfacv(j,bi,bj)
              advd2 = 0.d0
              addij = addij+adud2*cosfacu(j,bi,bj)*recip_dxc(i,j,bi,bj)
              addmj = addmj-adud2*cosfacu(j,bi,bj)*recip_dxc(i,j,bi,bj)
              adzij = adzij+adud2*recip_hfacw(i,j,k,bi,bj)*recip_dyg(i,
     $j,bi,bj)
              adzip = adzip-adud2*recip_hfacw(i,j,k,bi,bj)*recip_dyg(i,
     $j,bi,bj)
              adud2 = 0.d0
              adviscah_z(i+1,j) = adviscah_z(i+1,j)+adzpj*hfacz(i+1,j)*
     $vort3(i+1,j)
              advort3(i+1,j) = advort3(i+1,j)+adzpj*hfacz(i+1,j)*
     $viscah_z(i+1,j)
              adzpj = 0.d0
              adviscah_z(i,j+1) = adviscah_z(i,j+1)+adzip*hfacz(i,j+1)*
     $vort3(i,j+1)
              advort3(i,j+1) = advort3(i,j+1)+adzip*hfacz(i,j+1)*
     $viscah_z(i,j+1)
              adzip = 0.d0
              adviscah_z(i,j) = adviscah_z(i,j)+adzij*hfacz(i,j)*vort3(
     $i,j)
              advort3(i,j) = advort3(i,j)+adzij*hfacz(i,j)*viscah_z(i,j)
              adzij = 0.d0
              adhdiv(i-1,j) = adhdiv(i-1,j)+addmj*viscah_d(i-1,j)
              adviscah_d(i-1,j) = adviscah_d(i-1,j)+addmj*hdiv(i-1,j)
              addmj = 0.d0
              adhdiv(i,j-1) = adhdiv(i,j-1)+addim*viscah_d(i,j-1)
              adviscah_d(i,j-1) = adviscah_d(i,j-1)+addim*hdiv(i,j-1)
              addim = 0.d0
              adhdiv(i,j) = adhdiv(i,j)+addij*viscah_d(i,j)
              adviscah_d(i,j) = adviscah_d(i,j)+addij*hdiv(i,j)
              addij = 0.d0
            else
              addij = addij+advd2*viscahd*recip_dyc(i,j,bi,bj)
              addim = addim-advd2*viscahd*recip_dyc(i,j,bi,bj)
              adzij = adzij-advd2*viscahz*recip_hfacs(i,j,k,bi,bj)*
     $cosfacv(j,bi,bj)*recip_dxg(i,j,bi,bj)
              adzpj = adzpj+advd2*viscahz*recip_hfacs(i,j,k,bi,bj)*
     $cosfacv(j,bi,bj)*recip_dxg(i,j,bi,bj)
              advd2 = 0.d0
              addij = addij+adud2*viscahd*cosfacu(j,bi,bj)*recip_dxc(i,
     $j,bi,bj)
              addmj = addmj-adud2*viscahd*cosfacu(j,bi,bj)*recip_dxc(i,
     $j,bi,bj)
              adzij = adzij+adud2*viscahz*recip_hfacw(i,j,k,bi,bj)*
     $recip_dyg(i,j,bi,bj)
              adzip = adzip-adud2*viscahz*recip_hfacw(i,j,k,bi,bj)*
     $recip_dyg(i,j,bi,bj)
              adud2 = 0.d0
              advort3(i+1,j) = advort3(i+1,j)+adzpj*hfacz(i+1,j)
              adzpj = 0.d0
              advort3(i,j) = advort3(i,j)+adzij*hfacz(i,j)
              adzij = 0.d0
              advort3(i,j+1) = advort3(i,j+1)+adzip*hfacz(i,j+1)
              adzip = 0.d0
              adhdiv(i-1,j) = adhdiv(i-1,j)+addmj
              addmj = 0.d0
              adhdiv(i,j) = adhdiv(i,j)+addij
              addij = 0.d0
              adhdiv(i,j-1) = adhdiv(i,j-1)+addim
              addim = 0.d0
            endif
          end do
        end do
      else
        do j = 2-oly, sny+oly-1
          do i = 2-olx, snx+olx-1
            advdissip(i,j) = 0.d0
            adudissip(i,j) = 0.d0
          end do
        end do
      endif

      end

      subroutine admom_vi_u_coriolis( bi, bj, k, vfld, advfld, omega3, 
     $adomega3, hfacz, r_hfacz, aducoriolisterm )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )
      logical upwindvort3
      parameter ( upwindvort3 =  .false.  )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

C==============================================
C declare arguments
C==============================================
      double precision adomega3(1-olx:snx+olx,1-oly:sny+oly)
      double precision aducoriolisterm(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision hfacz(1-olx:snx+olx,1-oly:sny+oly)
      integer k
      double precision omega3(1-olx:snx+olx,1-oly:sny+oly)
      double precision r_hfacz(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision advbarxm
      double precision advbarxp
      double precision advbarxy
      double precision advort3ij
      double precision advort3ip
      double precision advort3mj
      double precision advort3mp
      double precision advort3u
      double precision epsil
      integer i
      integer j
      double precision onethird
      double precision vbarxm
      double precision vbarxp
      double precision vbarxy
      double precision vbarxyh
      double precision vort3u

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      advbarxm = 0.d0
      advbarxp = 0.d0
      advbarxy = 0.d0
      advort3ij = 0.d0
      advort3ip = 0.d0
      advort3mj = 0.d0
      advort3mp = 0.d0
      advort3u = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      epsil = 1.d-9
      onethird = 1.d0/3.d0
      if (usejamartmomadv) then
        do j = 1-oly, sny+oly-1
          do i = 2-olx, snx+olx-1
            aducoriolisterm(i,j) = aducoriolisterm(i,j)*(4*hfacw(i,j,k,
     $bi,bj)/max(epsil,hfacs(i,j,k,bi,bj)+hfacs(i-1,j,k,bi,bj)+hfacs(i,
     $j+1,k,bi,bj)+hfacs(i-1,j+1,k,bi,bj)))
          end do
        end do
      endif
      if (selectvortscheme .eq. 0) then
        do j = sny+oly-1, 1-oly, -1
          do i = snx+olx, 2-olx, -1
            vbarxy = 0.25*(vfld(i,j)*dxg(i,j,bi,bj)*hfacs(i,j,k,bi,bj)+
     $vfld(i-1,j)*dxg(i-1,j,bi,bj)*hfacs(i-1,j,k,bi,bj)+vfld(i,j+1)*dxg(
     $i,j+1,bi,bj)*hfacs(i,j+1,k,bi,bj)+vfld(i-1,j+1)*dxg(i-1,j+1,bi,bj)
     $*hfacs(i-1,j+1,k,bi,bj))
            if (upwindvort3) then
              if (vbarxy .gt. 0.) then
                vort3u = omega3(i,j)*r_hfacz(i,j)
              else
                vort3u = omega3(i,j+1)*r_hfacz(i,j+1)
              endif
            else
              vort3u = 0.5*(omega3(i,j)*r_hfacz(i,j)+omega3(i,j+1)*
     $r_hfacz(i,j+1))
            endif
            advbarxy = advbarxy+aducoriolisterm(i,j)*vort3u*recip_dxc(i,
     $j,bi,bj)*maskw(i,j,k,bi,bj)
            advort3u = advort3u+aducoriolisterm(i,j)*vbarxy*recip_dxc(i,
     $j,bi,bj)*maskw(i,j,k,bi,bj)
            aducoriolisterm(i,j) = 0.d0
            if (upwindvort3) then
              if (vbarxy .gt. 0.) then
                adomega3(i,j) = adomega3(i,j)+advort3u*r_hfacz(i,j)
                advort3u = 0.d0
              else
                adomega3(i,j+1) = adomega3(i,j+1)+advort3u*r_hfacz(i,j+
     $1)
                advort3u = 0.d0
              endif
            else
              adomega3(i,j+1) = adomega3(i,j+1)+0.5*advort3u*r_hfacz(i,
     $j+1)
              adomega3(i,j) = adomega3(i,j)+0.5*advort3u*r_hfacz(i,j)
              advort3u = 0.d0
            endif
            advfld(i-1,j+1) = advfld(i-1,j+1)+0.25*advbarxy*dxg(i-1,j+1,
     $bi,bj)*hfacs(i-1,j+1,k,bi,bj)
            advfld(i,j+1) = advfld(i,j+1)+0.25*advbarxy*dxg(i,j+1,bi,bj)
     $*hfacs(i,j+1,k,bi,bj)
            advfld(i-1,j) = advfld(i-1,j)+0.25*advbarxy*dxg(i-1,j,bi,bj)
     $*hfacs(i-1,j,k,bi,bj)
            advfld(i,j) = advfld(i,j)+0.25*advbarxy*dxg(i,j,bi,bj)*
     $hfacs(i,j,k,bi,bj)
            advbarxy = 0.d0
          end do
        end do
      else if (selectvortscheme .eq. 1) then
        do j = sny+oly-1, 1-oly, -1
          do i = snx+olx, 2-olx, -1
            vbarxy = 0.5*(vfld(i,j)*dxg(i,j,bi,bj)*hfacz(i,j)+vfld(i-1,
     $j)*dxg(i-1,j,bi,bj)*hfacz(i,j)+vfld(i,j+1)*dxg(i,j+1,bi,bj)*hfacz(
     $i,j+1)+vfld(i-1,j+1)*dxg(i-1,j+1,bi,bj)*hfacz(i,j+1))/max(epsil,
     $hfacz(i,j)+hfacz(i,j+1))
            if (upwindvort3) then
              if (vbarxy .gt. 0.) then
                vort3u = omega3(i,j)
              else
                vort3u = omega3(i,j+1)
              endif
            else
              vort3u = 0.5*(omega3(i,j)+omega3(i,j+1))
            endif
            advbarxy = advbarxy+aducoriolisterm(i,j)*vort3u*recip_dxc(i,
     $j,bi,bj)*maskw(i,j,k,bi,bj)
            advort3u = advort3u+aducoriolisterm(i,j)*vbarxy*recip_dxc(i,
     $j,bi,bj)*maskw(i,j,k,bi,bj)
            aducoriolisterm(i,j) = 0.d0
            if (upwindvort3) then
              if (vbarxy .gt. 0.) then
                adomega3(i,j) = adomega3(i,j)+advort3u
                advort3u = 0.d0
              else
                adomega3(i,j+1) = adomega3(i,j+1)+advort3u
                advort3u = 0.d0
              endif
            else
              adomega3(i,j+1) = adomega3(i,j+1)+0.5*advort3u
              adomega3(i,j) = adomega3(i,j)+0.5*advort3u
              advort3u = 0.d0
            endif
            vbarxyh = max(epsil,hfacz(i,j)+hfacz(i,j+1))
            advfld(i-1,j+1) = advfld(i-1,j+1)+advbarxy*(0.5*dxg(i-1,j+1,
     $bi,bj)*hfacz(i,j+1)/vbarxyh)
            advfld(i,j+1) = advfld(i,j+1)+advbarxy*(0.5*dxg(i,j+1,bi,bj)
     $*hfacz(i,j+1)/vbarxyh)
            advfld(i-1,j) = advfld(i-1,j)+advbarxy*(0.5*dxg(i-1,j,bi,bj)
     $*hfacz(i,j)/vbarxyh)
            advfld(i,j) = advfld(i,j)+advbarxy*(0.5*dxg(i,j,bi,bj)*
     $hfacz(i,j)/vbarxyh)
            advbarxy = 0.d0
          end do
        end do
      else if (selectvortscheme .eq. 2) then
        do j = sny+oly-1, 1-oly, -1
          do i = snx+olx, 2-olx, -1
            vbarxm = 0.5*(vfld(i,j)*dxg(i,j,bi,bj)*hfacs(i,j,k,bi,bj)+
     $vfld(i-1,j)*dxg(i-1,j,bi,bj)*hfacs(i-1,j,k,bi,bj))
            vbarxp = 0.5*(vfld(i,j+1)*dxg(i,j+1,bi,bj)*hfacs(i,j+1,k,bi,
     $bj)+vfld(i-1,j+1)*dxg(i-1,j+1,bi,bj)*hfacs(i-1,j+1,k,bi,bj))
            advort3u = advort3u+aducoriolisterm(i,j)*recip_dxc(i,j,bi,
     $bj)*maskw(i,j,k,bi,bj)
            aducoriolisterm(i,j) = 0.d0
            if (upwindvort3) then
              if (vbarxm+vbarxp .gt. 0.) then
                adomega3(i,j) = adomega3(i,j)+advort3u*vbarxm*r_hfacz(i,
     $j)
                advbarxm = advbarxm+advort3u*r_hfacz(i,j)*omega3(i,j)
                advort3u = 0.d0
              else
                adomega3(i,j+1) = adomega3(i,j+1)+advort3u*vbarxp*
     $r_hfacz(i,j+1)
                advbarxp = advbarxp+advort3u*r_hfacz(i,j+1)*omega3(i,j+
     $1)
                advort3u = 0.d0
              endif
            else
              adomega3(i,j+1) = adomega3(i,j+1)+0.5d0*advort3u*vbarxp*
     $r_hfacz(i,j+1)
              adomega3(i,j) = adomega3(i,j)+0.5d0*advort3u*vbarxm*
     $r_hfacz(i,j)
              advbarxm = advbarxm+0.5d0*advort3u*r_hfacz(i,j)*omega3(i,
     $j)
              advbarxp = advbarxp+0.5d0*advort3u*r_hfacz(i,j+1)*omega3(
     $i,j+1)
              advort3u = 0.d0
            endif
            advfld(i-1,j+1) = advfld(i-1,j+1)+0.5*advbarxp*dxg(i-1,j+1,
     $bi,bj)*hfacs(i-1,j+1,k,bi,bj)
            advfld(i,j+1) = advfld(i,j+1)+0.5*advbarxp*dxg(i,j+1,bi,bj)*
     $hfacs(i,j+1,k,bi,bj)
            advbarxp = 0.d0
            advfld(i-1,j) = advfld(i-1,j)+0.5*advbarxm*dxg(i-1,j,bi,bj)*
     $hfacs(i-1,j,k,bi,bj)
            advfld(i,j) = advfld(i,j)+0.5*advbarxm*dxg(i,j,bi,bj)*hfacs(
     $i,j,k,bi,bj)
            advbarxm = 0.d0
          end do
        end do
      else if (selectvortscheme .eq. 3) then
        do j = sny+oly-1, 1-oly, -1
          advort3ij = 0.d0
          advort3ip = 0.d0
          advort3mj = 0.d0
          advort3mp = 0.d0
          do i = snx+olx-1, 2-olx, -1
            advort3ij = 0.d0
            advort3ip = 0.d0
            advort3mj = 0.d0
            advort3mp = 0.d0
            advort3ij = advort3ij+0.25d0*aducoriolisterm(i,j)*recip_dxc(
     $i,j,bi,bj)*maskw(i,j,k,bi,bj)
            advort3ip = advort3ip+0.25d0*aducoriolisterm(i,j)*recip_dxc(
     $i,j,bi,bj)*maskw(i,j,k,bi,bj)
            advort3mj = advort3mj+0.25d0*aducoriolisterm(i,j)*recip_dxc(
     $i,j,bi,bj)*maskw(i,j,k,bi,bj)
            advort3mp = advort3mp+0.25d0*aducoriolisterm(i,j)*recip_dxc(
     $i,j,bi,bj)*maskw(i,j,k,bi,bj)
            aducoriolisterm(i,j) = 0.d0
            adomega3(i+1,j+1) = adomega3(i+1,j+1)+advort3ip*r_hfacz(i+1,
     $j+1)*onethird*vfld(i,j+1)*dxg(i,j+1,bi,bj)*hfacs(i,j+1,k,bi,bj)
            adomega3(i,j+1) = adomega3(i,j+1)+advort3ip*r_hfacz(i,j+1)*
     $onethird*vfld(i,j+1)*dxg(i,j+1,bi,bj)*hfacs(i,j+1,k,bi,bj)
            adomega3(i,j) = adomega3(i,j)+advort3ip*r_hfacz(i,j)*
     $onethird*vfld(i,j+1)*dxg(i,j+1,bi,bj)*hfacs(i,j+1,k,bi,bj)
            advfld(i,j+1) = advfld(i,j+1)+advort3ip*(r_hfacz(i,j+1)*
     $omega3(i,j+1)+r_hfacz(i,j)*omega3(i,j)+r_hfacz(i+1,j+1)*omega3(i+
     $1,j+1))*onethird*dxg(i,j+1,bi,bj)*hfacs(i,j+1,k,bi,bj)
            advort3ip = 0.d0
            adomega3(i-1,j+1) = adomega3(i-1,j+1)+advort3mp*r_hfacz(i-1,
     $j+1)*onethird*vfld(i-1,j+1)*dxg(i-1,j+1,bi,bj)*hfacs(i-1,j+1,k,bi,
     $bj)
            adomega3(i,j+1) = adomega3(i,j+1)+advort3mp*r_hfacz(i,j+1)*
     $onethird*vfld(i-1,j+1)*dxg(i-1,j+1,bi,bj)*hfacs(i-1,j+1,k,bi,bj)
            adomega3(i,j) = adomega3(i,j)+advort3mp*r_hfacz(i,j)*
     $onethird*vfld(i-1,j+1)*dxg(i-1,j+1,bi,bj)*hfacs(i-1,j+1,k,bi,bj)
            advfld(i-1,j+1) = advfld(i-1,j+1)+advort3mp*(r_hfacz(i,j+1)*
     $omega3(i,j+1)+r_hfacz(i,j)*omega3(i,j)+r_hfacz(i-1,j+1)*omega3(i-
     $1,j+1))*onethird*dxg(i-1,j+1,bi,bj)*hfacs(i-1,j+1,k,bi,bj)
            advort3mp = 0.d0
            adomega3(i,j+1) = adomega3(i,j+1)+advort3ij*r_hfacz(i,j+1)*
     $onethird*vfld(i,j)*dxg(i,j,bi,bj)*hfacs(i,j,k,bi,bj)
            adomega3(i+1,j) = adomega3(i+1,j)+advort3ij*r_hfacz(i+1,j)*
     $onethird*vfld(i,j)*dxg(i,j,bi,bj)*hfacs(i,j,k,bi,bj)
            adomega3(i,j) = adomega3(i,j)+advort3ij*r_hfacz(i,j)*
     $onethird*vfld(i,j)*dxg(i,j,bi,bj)*hfacs(i,j,k,bi,bj)
            advfld(i,j) = advfld(i,j)+advort3ij*(r_hfacz(i,j)*omega3(i,
     $j)+r_hfacz(i,j+1)*omega3(i,j+1)+r_hfacz(i+1,j)*omega3(i+1,j))*
     $onethird*dxg(i,j,bi,bj)*hfacs(i,j,k,bi,bj)
            advort3ij = 0.d0
            adomega3(i,j+1) = adomega3(i,j+1)+advort3mj*r_hfacz(i,j+1)*
     $onethird*vfld(i-1,j)*dxg(i-1,j,bi,bj)*hfacs(i-1,j,k,bi,bj)
            adomega3(i-1,j) = adomega3(i-1,j)+advort3mj*r_hfacz(i-1,j)*
     $onethird*vfld(i-1,j)*dxg(i-1,j,bi,bj)*hfacs(i-1,j,k,bi,bj)
            adomega3(i,j) = adomega3(i,j)+advort3mj*r_hfacz(i,j)*
     $onethird*vfld(i-1,j)*dxg(i-1,j,bi,bj)*hfacs(i-1,j,k,bi,bj)
            advfld(i-1,j) = advfld(i-1,j)+advort3mj*(r_hfacz(i,j)*
     $omega3(i,j)+r_hfacz(i,j+1)*omega3(i,j+1)+r_hfacz(i-1,j)*omega3(i-
     $1,j))*onethird*dxg(i-1,j,bi,bj)*hfacs(i-1,j,k,bi,bj)
            advort3mj = 0.d0
          end do
        end do
      endif

      end

      subroutine admom_vi_u_coriolis_c4( bi, bj, k, vfld, advfld, 
     $omega3, adomega3, r_hfacz, aducoriolisterm )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      logical fourthvort3
      parameter ( fourthvort3 =  .true.  )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision onesixth
      parameter ( onesixth = 1.d0/6.d0 )
      double precision onetwelve
      parameter ( onetwelve = 1.d0/12.d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

C==============================================
C declare arguments
C==============================================
      double precision adomega3(1-olx:snx+olx,1-oly:sny+oly)
      double precision aducoriolisterm(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k
      double precision omega3(1-olx:snx+olx,1-oly:sny+oly)
      double precision r_hfacz(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adrjm
      double precision adrjp
      double precision advbarxm
      double precision advbarxp
      double precision advbarxy
      double precision advort3r(1-olx:snx+olx,1-oly:sny+oly)
      double precision advort3u
      integer i
      integer ip1
      integer ip2
      integer j
      logical northeastcorner
      logical northwestcorner
      double precision rjm
      double precision rjp
      logical southeastcorner
      logical southwestcorner
      double precision vbarxm
      double precision vbarxp
      double precision vbarxy
      double precision vort3r(1-olx:snx+olx,1-oly:sny+oly)
      double precision vort3u

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adrjm = 0.d0
      adrjp = 0.d0
      advbarxm = 0.d0
      advbarxp = 0.d0
      advbarxy = 0.d0
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advort3r(ip1,ip2) = 0.d0
        end do
      end do
      advort3u = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          vort3r(i,j) = r_hfacz(i,j)*omega3(i,j)
        end do
      end do
      if (usecubedsphereexchange .and. highordervorticity) then
        southwestcorner =  .true. 
        southeastcorner =  .true. 
        northwestcorner =  .true. 
        northeastcorner =  .true. 
        if (southwestcorner) then
          i = 1
          j = 1
          vort3r(i,j-1) = (vort3r(i,j-1)+vort3r(i+1,j))*0.5d0
        endif
        if (southeastcorner) then
          i = snx+1
          j = 1
          vort3r(i,j-1) = (vort3r(i,j-1)+vort3r(i-1,j))*0.5d0
        endif
        if (northwestcorner) then
          i = 1
          j = sny+1
          vort3r(i,j+1) = (vort3r(i,j+1)+vort3r(i+1,j))*0.5d0
        endif
        if (northeastcorner) then
          i = snx+1
          j = sny+1
          vort3r(i,j+1) = (vort3r(i,j+1)+vort3r(i-1,j))*0.5d0
        endif
      endif
      if (selectvortscheme .eq. 0) then
        do j = sny, 1, -1
          do i = snx+1, 1, -1
            vbarxy = 0.25*(vfld(i,j)*dxg(i,j,bi,bj)*hfacs(i,j,k,bi,bj)+
     $vfld(i-1,j)*dxg(i-1,j,bi,bj)*hfacs(i-1,j,k,bi,bj)+vfld(i,j+1)*dxg(
     $i,j+1,bi,bj)*hfacs(i,j+1,k,bi,bj)+vfld(i-1,j+1)*dxg(i-1,j+1,bi,bj)
     $*hfacs(i-1,j+1,k,bi,bj))
            if (upwindvorticity) then
              if (vbarxy .gt. 0.) then
                vort3u = vort3r(i,j)
              else
                vort3u = vort3r(i,j+1)
              endif
            else if (fourthvort3) then
              rjp = vort3r(i,j+2)-vort3r(i,j+1)
              rjm = vort3r(i,j)-vort3r(i,j-1)
              vort3u = 0.5*(vort3r(i,j)+vort3r(i,j+1)-onetwelve*(rjp-
     $rjm))
            else
              vort3u = 0.5*(vort3r(i,j)+vort3r(i,j+1))
            endif
            advbarxy = advbarxy+aducoriolisterm(i,j)*vort3u*recip_dxc(i,
     $j,bi,bj)*maskw(i,j,k,bi,bj)
            advort3u = advort3u+aducoriolisterm(i,j)*vbarxy*recip_dxc(i,
     $j,bi,bj)*maskw(i,j,k,bi,bj)
            aducoriolisterm(i,j) = 0.d0
            if (upwindvorticity) then
              if (vbarxy .gt. 0.) then
                advort3r(i,j) = advort3r(i,j)+advort3u
                advort3u = 0.d0
              else
                advort3r(i,j+1) = advort3r(i,j+1)+advort3u
                advort3u = 0.d0
              endif
            else if (fourthvort3) then
              adrjm = adrjm+0.5*advort3u*onetwelve
              adrjp = adrjp-0.5*advort3u*onetwelve
              advort3r(i,j+1) = advort3r(i,j+1)+0.5*advort3u
              advort3r(i,j) = advort3r(i,j)+0.5*advort3u
              advort3u = 0.d0
              advort3r(i,j-1) = advort3r(i,j-1)-adrjm
              advort3r(i,j) = advort3r(i,j)+adrjm
              adrjm = 0.d0
              advort3r(i,j+2) = advort3r(i,j+2)+adrjp
              advort3r(i,j+1) = advort3r(i,j+1)-adrjp
              adrjp = 0.d0
            else
              advort3r(i,j+1) = advort3r(i,j+1)+0.5*advort3u
              advort3r(i,j) = advort3r(i,j)+0.5*advort3u
              advort3u = 0.d0
            endif
            advfld(i-1,j+1) = advfld(i-1,j+1)+0.25*advbarxy*dxg(i-1,j+1,
     $bi,bj)*hfacs(i-1,j+1,k,bi,bj)
            advfld(i,j+1) = advfld(i,j+1)+0.25*advbarxy*dxg(i,j+1,bi,bj)
     $*hfacs(i,j+1,k,bi,bj)
            advfld(i-1,j) = advfld(i-1,j)+0.25*advbarxy*dxg(i-1,j,bi,bj)
     $*hfacs(i-1,j,k,bi,bj)
            advfld(i,j) = advfld(i,j)+0.25*advbarxy*dxg(i,j,bi,bj)*
     $hfacs(i,j,k,bi,bj)
            advbarxy = 0.d0
          end do
        end do
      else if (selectvortscheme .eq. 2) then
        do j = sny, 1, -1
          do i = snx+1, 1, -1
            vbarxm = 0.5*(vfld(i,j)*dxg(i,j,bi,bj)*hfacs(i,j,k,bi,bj)+
     $vfld(i-1,j)*dxg(i-1,j,bi,bj)*hfacs(i-1,j,k,bi,bj))
            vbarxp = 0.5*(vfld(i,j+1)*dxg(i,j+1,bi,bj)*hfacs(i,j+1,k,bi,
     $bj)+vfld(i-1,j+1)*dxg(i-1,j+1,bi,bj)*hfacs(i-1,j+1,k,bi,bj))
            advort3u = advort3u+aducoriolisterm(i,j)*recip_dxc(i,j,bi,
     $bj)*maskw(i,j,k,bi,bj)
            aducoriolisterm(i,j) = 0.d0
            if (upwindvorticity) then
              if (vbarxm+vbarxp .gt. 0.) then
                advbarxm = advbarxm+advort3u*vort3r(i,j)
                advort3r(i,j) = advort3r(i,j)+advort3u*vbarxm
                advort3u = 0.d0
              else
                advbarxp = advbarxp+advort3u*vort3r(i,j+1)
                advort3r(i,j+1) = advort3r(i,j+1)+advort3u*vbarxp
                advort3u = 0.d0
              endif
            else if (fourthvort3) then
              rjp = vort3r(i,j+1)-onesixth*(vort3r(i,j+2)-vort3r(i,j))
              rjm = vort3r(i,j)+onesixth*(vort3r(i,j+1)-vort3r(i,j-1))
              adrjm = adrjm+0.5*advort3u*vbarxm
              adrjp = adrjp+0.5*advort3u*vbarxp
              advbarxm = advbarxm+0.5*advort3u*rjm
              advbarxp = advbarxp+0.5*advort3u*rjp
              advort3u = 0.d0
              advort3r(i,j-1) = advort3r(i,j-1)-adrjm*onesixth
              advort3r(i,j+1) = advort3r(i,j+1)+adrjm*onesixth
              advort3r(i,j) = advort3r(i,j)+adrjm
              adrjm = 0.d0
              advort3r(i,j+2) = advort3r(i,j+2)-adrjp*onesixth
              advort3r(i,j+1) = advort3r(i,j+1)+adrjp
              advort3r(i,j) = advort3r(i,j)+adrjp*onesixth
              adrjp = 0.d0
            else
              advbarxm = advbarxm+0.5*advort3u*vort3r(i,j)
              advbarxp = advbarxp+0.5*advort3u*vort3r(i,j+1)
              advort3r(i,j+1) = advort3r(i,j+1)+0.5*advort3u*vbarxp
              advort3r(i,j) = advort3r(i,j)+0.5*advort3u*vbarxm
              advort3u = 0.d0
            endif
            advfld(i-1,j+1) = advfld(i-1,j+1)+0.5*advbarxp*dxg(i-1,j+1,
     $bi,bj)*hfacs(i-1,j+1,k,bi,bj)
            advfld(i,j+1) = advfld(i,j+1)+0.5*advbarxp*dxg(i,j+1,bi,bj)*
     $hfacs(i,j+1,k,bi,bj)
            advbarxp = 0.d0
            advfld(i-1,j) = advfld(i-1,j)+0.5*advbarxm*dxg(i-1,j,bi,bj)*
     $hfacs(i-1,j,k,bi,bj)
            advfld(i,j) = advfld(i,j)+0.5*advbarxm*dxg(i,j,bi,bj)*hfacs(
     $i,j,k,bi,bj)
            advbarxm = 0.d0
          end do
        end do
      endif
      if (usecubedsphereexchange .and. highordervorticity) then
        if (northeastcorner) then
          advort3r(i-1,j) = advort3r(i-1,j)+0.5d0*advort3r(i,j+1)
          advort3r(i,j+1) = 0.5d0*advort3r(i,j+1)
        endif
        if (northwestcorner) then
          i = 1
          j = sny+1
          advort3r(i+1,j) = advort3r(i+1,j)+0.5d0*advort3r(i,j+1)
          advort3r(i,j+1) = 0.5d0*advort3r(i,j+1)
        endif
        if (southeastcorner) then
          i = snx+1
          j = 1
          advort3r(i-1,j) = advort3r(i-1,j)+0.5d0*advort3r(i,j-1)
          advort3r(i,j-1) = 0.5d0*advort3r(i,j-1)
        endif
        if (southwestcorner) then
          i = 1
          j = 1
          advort3r(i+1,j) = advort3r(i+1,j)+0.5d0*advort3r(i,j-1)
          advort3r(i,j-1) = 0.5d0*advort3r(i,j-1)
        endif
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          adomega3(i,j) = adomega3(i,j)+advort3r(i,j)*r_hfacz(i,j)
          advort3r(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_vi_u_grad_ke( bi, bj, k, adke, addkedx )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision addkedx(1-olx:snx+olx,1-oly:sny+oly)
      double precision adke(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly, sny+oly
        do i = 2-olx, snx+olx
          adke(i-1,j) = adke(i-1,j)+addkedx(i,j)*recip_dxc(i,j,bi,bj)*
     $maskw(i,j,k,bi,bj)
          adke(i,j) = adke(i,j)-addkedx(i,j)*recip_dxc(i,j,bi,bj)*maskw(
     $i,j,k,bi,bj)
          addkedx(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_vi_u_vertshear( bi, bj, k, ufld, adufld, wfld, 
     $adwfld, adushearterm )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

C==============================================
C declare arguments
C==============================================
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adushearterm(1-olx:snx+olx,1-oly:sny+oly)
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer k
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)

C==============================================
C declare local variables
C==============================================
      double precision adusheartermh
      double precision adusheartermi
      double precision aduzm
      double precision aduzp
      double precision adwbarxm
      double precision adwbarxp
      integer i
      integer j
      integer km1
      integer kp1
      double precision mask_km1
      double precision mask_kp1
      logical radvareaweight
      double precision uzm
      double precision uzp
      double precision wbarxm
      double precision wbarxp

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      aduzm = 0.d0
      aduzp = 0.d0
      adwbarxm = 0.d0
      adwbarxp = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      radvareaweight =  .true. 
      if (selectkescheme .eq. 1 .or. selectkescheme .eq. 3) then
        radvareaweight =  .false. 
      endif
      kp1 = min(k+1,nr)
      mask_kp1 = 1.
      if (k .eq. nr) then
        mask_kp1 = 0.
      endif
      km1 = max(k-1,1)
      mask_km1 = 1.
      if (k .eq. 1) then
        mask_km1 = 0.
      endif
      do j = sny+oly, 1-oly, -1
        do i = snx+olx, 2-olx, -1
          if (radvareaweight) then
            wbarxm = 0.5*(wfld(i,j,k,bi,bj)*ra(i,j,bi,bj)*maskc(i,j,km1,
     $bi,bj)+wfld(i-1,j,k,bi,bj)*ra(i-1,j,bi,bj)*maskc(i-1,j,km1,bi,bj))
     $*mask_km1*recip_raw(i,j,bi,bj)
            wbarxp = 0.5*(wfld(i,j,kp1,bi,bj)*ra(i,j,bi,bj)+wfld(i-1,j,
     $kp1,bi,bj)*ra(i-1,j,bi,bj))*mask_kp1*recip_raw(i,j,bi,bj)
          else
            wbarxm = 0.5*(wfld(i,j,k,bi,bj)*maskc(i,j,km1,bi,bj)+wfld(i-
     $1,j,k,bi,bj)*maskc(i-1,j,km1,bi,bj))*mask_km1
            wbarxp = 0.5*(wfld(i,j,kp1,bi,bj)+wfld(i-1,j,kp1,bi,bj))*
     $mask_kp1
          endif
          uzm = (ufld(i,j,k,bi,bj)-mask_km1*ufld(i,j,km1,bi,bj))*rksign
          uzp = (mask_kp1*ufld(i,j,kp1,bi,bj)-ufld(i,j,k,bi,bj))*rksign
          if (upwindshear) then
            adusheartermh = 0.5*adushearterm(i,j)*uzm*recip_hfacw(i,j,k,
     $bi,bj)*recip_drf(k)
            adusheartermi = -(0.5*adushearterm(i,j)*uzp*recip_hfacw(i,j,
     $k,bi,bj)*recip_drf(k))
            aduzm = aduzm-0.5*adushearterm(i,j)*(wbarxm-abs(wbarxm))*
     $recip_hfacw(i,j,k,bi,bj)*recip_drf(k)
            aduzp = aduzp-0.5*adushearterm(i,j)*(wbarxp+abs(wbarxp))*
     $recip_hfacw(i,j,k,bi,bj)*recip_drf(k)
            adwbarxm = adwbarxm-0.5*adushearterm(i,j)*uzm*recip_hfacw(i,
     $j,k,bi,bj)*recip_drf(k)
            adwbarxp = adwbarxp-0.5*adushearterm(i,j)*uzp*recip_hfacw(i,
     $j,k,bi,bj)*recip_drf(k)
            adwbarxp = adwbarxp+adusheartermi*sign(1.d0,wbarxp)
            adwbarxm = adwbarxm+adusheartermh*sign(1.d0,wbarxm)
            adushearterm(i,j) = 0.d0
          else
            aduzm = aduzm-0.5*adushearterm(i,j)*wbarxm*recip_hfacw(i,j,
     $k,bi,bj)*recip_drf(k)
            aduzp = aduzp-0.5*adushearterm(i,j)*wbarxp*recip_hfacw(i,j,
     $k,bi,bj)*recip_drf(k)
            adwbarxm = adwbarxm-0.5*adushearterm(i,j)*uzm*recip_hfacw(i,
     $j,k,bi,bj)*recip_drf(k)
            adwbarxp = adwbarxp-0.5*adushearterm(i,j)*uzp*recip_hfacw(i,
     $j,k,bi,bj)*recip_drf(k)
            adushearterm(i,j) = 0.d0
          endif
          adufld(i,j,k,bi,bj) = adufld(i,j,k,bi,bj)-aduzp*rksign
          adufld(i,j,kp1,bi,bj) = adufld(i,j,kp1,bi,bj)+aduzp*mask_kp1*
     $rksign
          aduzp = 0.d0
          adufld(i,j,k,bi,bj) = adufld(i,j,k,bi,bj)+aduzm*rksign
          adufld(i,j,km1,bi,bj) = adufld(i,j,km1,bi,bj)-aduzm*mask_km1*
     $rksign
          aduzm = 0.d0
          if (radvareaweight) then
            adwfld(i-1,j,kp1,bi,bj) = adwfld(i-1,j,kp1,bi,bj)+0.5*
     $adwbarxp*ra(i-1,j,bi,bj)*mask_kp1*recip_raw(i,j,bi,bj)
            adwfld(i,j,kp1,bi,bj) = adwfld(i,j,kp1,bi,bj)+0.5*adwbarxp*
     $ra(i,j,bi,bj)*mask_kp1*recip_raw(i,j,bi,bj)
            adwbarxp = 0.d0
            adwfld(i-1,j,k,bi,bj) = adwfld(i-1,j,k,bi,bj)+0.5*adwbarxm*
     $ra(i-1,j,bi,bj)*maskc(i-1,j,km1,bi,bj)*mask_km1*recip_raw(i,j,bi,
     $bj)
            adwfld(i,j,k,bi,bj) = adwfld(i,j,k,bi,bj)+0.5*adwbarxm*ra(i,
     $j,bi,bj)*maskc(i,j,km1,bi,bj)*mask_km1*recip_raw(i,j,bi,bj)
            adwbarxm = 0.d0
          else
            adwfld(i-1,j,kp1,bi,bj) = adwfld(i-1,j,kp1,bi,bj)+0.5*
     $adwbarxp*mask_kp1
            adwfld(i,j,kp1,bi,bj) = adwfld(i,j,kp1,bi,bj)+0.5*adwbarxp*
     $mask_kp1
            adwbarxp = 0.d0
            adwfld(i-1,j,k,bi,bj) = adwfld(i-1,j,k,bi,bj)+0.5*adwbarxm*
     $maskc(i-1,j,km1,bi,bj)*mask_km1
            adwfld(i,j,k,bi,bj) = adwfld(i,j,k,bi,bj)+0.5*adwbarxm*
     $maskc(i,j,km1,bi,bj)*mask_km1
            adwbarxm = 0.d0
          endif
        end do
      end do

      end

      subroutine admom_vi_v_coriolis( bi, bj, k, ufld, adufld, omega3, 
     $adomega3, hfacz, r_hfacz, advcoriolisterm )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )
      logical upwindvort3
      parameter ( upwindvort3 =  .false.  )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

C==============================================
C declare arguments
C==============================================
      double precision adomega3(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advcoriolisterm(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      double precision hfacz(1-olx:snx+olx,1-oly:sny+oly)
      integer k
      double precision omega3(1-olx:snx+olx,1-oly:sny+oly)
      double precision r_hfacz(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adubarxy
      double precision adubarym
      double precision adubaryp
      double precision advort3ij
      double precision advort3im
      double precision advort3pj
      double precision advort3pm
      double precision advort3v
      double precision epsil
      integer i
      integer j
      double precision onethird
      double precision ubarxy
      double precision ubarxyh
      double precision ubarym
      double precision ubaryp
      double precision vort3v

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adubarxy = 0.d0
      adubarym = 0.d0
      adubaryp = 0.d0
      advort3ij = 0.d0
      advort3im = 0.d0
      advort3pj = 0.d0
      advort3pm = 0.d0
      advort3v = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      epsil = 1.d-9
      onethird = 1.d0/3.d0
      if (usejamartmomadv) then
        do j = 2-oly, sny+oly-1
          do i = 1-olx, snx+olx-1
            advcoriolisterm(i,j) = advcoriolisterm(i,j)*(4*hfacs(i,j,k,
     $bi,bj)/max(epsil,hfacw(i,j,k,bi,bj)+hfacw(i,j-1,k,bi,bj)+hfacw(i+
     $1,j,k,bi,bj)+hfacw(i+1,j-1,k,bi,bj)))
          end do
        end do
      endif
      if (selectvortscheme .eq. 0) then
        do j = sny+oly, 2-oly, -1
          do i = snx+olx-1, 1-olx, -1
            ubarxy = 0.25*(ufld(i,j)*dyg(i,j,bi,bj)*hfacw(i,j,k,bi,bj)+
     $ufld(i,j-1)*dyg(i,j-1,bi,bj)*hfacw(i,j-1,k,bi,bj)+ufld(i+1,j)*dyg(
     $i+1,j,bi,bj)*hfacw(i+1,j,k,bi,bj)+ufld(i+1,j-1)*dyg(i+1,j-1,bi,bj)
     $*hfacw(i+1,j-1,k,bi,bj))
            if (upwindvort3) then
              if (ubarxy .gt. 0.) then
                vort3v = omega3(i,j)*r_hfacz(i,j)
              else
                vort3v = omega3(i+1,j)*r_hfacz(i+1,j)
              endif
            else
              vort3v = 0.5*(omega3(i,j)*r_hfacz(i,j)+omega3(i+1,j)*
     $r_hfacz(i+1,j))
            endif
            adubarxy = adubarxy-advcoriolisterm(i,j)*vort3v*recip_dyc(i,
     $j,bi,bj)*masks(i,j,k,bi,bj)
            advort3v = advort3v-advcoriolisterm(i,j)*ubarxy*recip_dyc(i,
     $j,bi,bj)*masks(i,j,k,bi,bj)
            advcoriolisterm(i,j) = 0.d0
            if (upwindvort3) then
              if (ubarxy .gt. 0.) then
                adomega3(i,j) = adomega3(i,j)+advort3v*r_hfacz(i,j)
                advort3v = 0.d0
              else
                adomega3(i+1,j) = adomega3(i+1,j)+advort3v*r_hfacz(i+1,
     $j)
                advort3v = 0.d0
              endif
            else
              adomega3(i+1,j) = adomega3(i+1,j)+0.5*advort3v*r_hfacz(i+
     $1,j)
              adomega3(i,j) = adomega3(i,j)+0.5*advort3v*r_hfacz(i,j)
              advort3v = 0.d0
            endif
            adufld(i+1,j-1) = adufld(i+1,j-1)+0.25*adubarxy*dyg(i+1,j-1,
     $bi,bj)*hfacw(i+1,j-1,k,bi,bj)
            adufld(i,j-1) = adufld(i,j-1)+0.25*adubarxy*dyg(i,j-1,bi,bj)
     $*hfacw(i,j-1,k,bi,bj)
            adufld(i+1,j) = adufld(i+1,j)+0.25*adubarxy*dyg(i+1,j,bi,bj)
     $*hfacw(i+1,j,k,bi,bj)
            adufld(i,j) = adufld(i,j)+0.25*adubarxy*dyg(i,j,bi,bj)*
     $hfacw(i,j,k,bi,bj)
            adubarxy = 0.d0
          end do
        end do
      else if (selectvortscheme .eq. 1) then
        do j = sny+oly, 2-oly, -1
          do i = snx+olx-1, 1-olx, -1
            ubarxy = 0.5*(ufld(i,j)*dyg(i,j,bi,bj)*hfacz(i,j)+ufld(i,j-
     $1)*dyg(i,j-1,bi,bj)*hfacz(i,j)+ufld(i+1,j)*dyg(i+1,j,bi,bj)*hfacz(
     $i+1,j)+ufld(i+1,j-1)*dyg(i+1,j-1,bi,bj)*hfacz(i+1,j))/max(epsil,
     $hfacz(i,j)+hfacz(i+1,j))
            if (upwindvort3) then
              if (ubarxy .gt. 0.) then
                vort3v = omega3(i,j)
              else
                vort3v = omega3(i+1,j)
              endif
            else
              vort3v = 0.5*(omega3(i,j)+omega3(i+1,j))
            endif
            adubarxy = adubarxy-advcoriolisterm(i,j)*vort3v*recip_dyc(i,
     $j,bi,bj)*masks(i,j,k,bi,bj)
            advort3v = advort3v-advcoriolisterm(i,j)*ubarxy*recip_dyc(i,
     $j,bi,bj)*masks(i,j,k,bi,bj)
            advcoriolisterm(i,j) = 0.d0
            if (upwindvort3) then
              if (ubarxy .gt. 0.) then
                adomega3(i,j) = adomega3(i,j)+advort3v
                advort3v = 0.d0
              else
                adomega3(i+1,j) = adomega3(i+1,j)+advort3v
                advort3v = 0.d0
              endif
            else
              adomega3(i+1,j) = adomega3(i+1,j)+0.5*advort3v
              adomega3(i,j) = adomega3(i,j)+0.5*advort3v
              advort3v = 0.d0
            endif
            ubarxyh = max(epsil,hfacz(i,j)+hfacz(i+1,j))
            adufld(i+1,j-1) = adufld(i+1,j-1)+adubarxy*(0.5*dyg(i+1,j-1,
     $bi,bj)*hfacz(i+1,j)/ubarxyh)
            adufld(i,j-1) = adufld(i,j-1)+adubarxy*(0.5*dyg(i,j-1,bi,bj)
     $*hfacz(i,j)/ubarxyh)
            adufld(i+1,j) = adufld(i+1,j)+adubarxy*(0.5*dyg(i+1,j,bi,bj)
     $*hfacz(i+1,j)/ubarxyh)
            adufld(i,j) = adufld(i,j)+adubarxy*(0.5*dyg(i,j,bi,bj)*
     $hfacz(i,j)/ubarxyh)
            adubarxy = 0.d0
          end do
        end do
      else if (selectvortscheme .eq. 2) then
        do j = sny+oly, 2-oly, -1
          do i = snx+olx-1, 1-olx, -1
            ubarym = 0.5*(ufld(i,j)*dyg(i,j,bi,bj)*hfacw(i,j,k,bi,bj)+
     $ufld(i,j-1)*dyg(i,j-1,bi,bj)*hfacw(i,j-1,k,bi,bj))
            ubaryp = 0.5*(ufld(i+1,j)*dyg(i+1,j,bi,bj)*hfacw(i+1,j,k,bi,
     $bj)+ufld(i+1,j-1)*dyg(i+1,j-1,bi,bj)*hfacw(i+1,j-1,k,bi,bj))
            advort3v = advort3v-advcoriolisterm(i,j)*recip_dyc(i,j,bi,
     $bj)*masks(i,j,k,bi,bj)
            advcoriolisterm(i,j) = 0.d0
            if (upwindvort3) then
              if (ubarym+ubaryp .gt. 0.) then
                adomega3(i,j) = adomega3(i,j)+advort3v*ubarym*r_hfacz(i,
     $j)
                adubarym = adubarym+advort3v*r_hfacz(i,j)*omega3(i,j)
                advort3v = 0.d0
              else
                adomega3(i+1,j) = adomega3(i+1,j)+advort3v*ubaryp*
     $r_hfacz(i+1,j)
                adubaryp = adubaryp+advort3v*r_hfacz(i+1,j)*omega3(i+1,
     $j)
                advort3v = 0.d0
              endif
            else
              adomega3(i+1,j) = adomega3(i+1,j)+0.5d0*advort3v*ubaryp*
     $r_hfacz(i+1,j)
              adomega3(i,j) = adomega3(i,j)+0.5d0*advort3v*ubarym*
     $r_hfacz(i,j)
              adubarym = adubarym+0.5d0*advort3v*r_hfacz(i,j)*omega3(i,
     $j)
              adubaryp = adubaryp+0.5d0*advort3v*r_hfacz(i+1,j)*omega3(
     $i+1,j)
              advort3v = 0.d0
            endif
            adufld(i+1,j-1) = adufld(i+1,j-1)+0.5*adubaryp*dyg(i+1,j-1,
     $bi,bj)*hfacw(i+1,j-1,k,bi,bj)
            adufld(i+1,j) = adufld(i+1,j)+0.5*adubaryp*dyg(i+1,j,bi,bj)*
     $hfacw(i+1,j,k,bi,bj)
            adubaryp = 0.d0
            adufld(i,j-1) = adufld(i,j-1)+0.5*adubarym*dyg(i,j-1,bi,bj)*
     $hfacw(i,j-1,k,bi,bj)
            adufld(i,j) = adufld(i,j)+0.5*adubarym*dyg(i,j,bi,bj)*hfacw(
     $i,j,k,bi,bj)
            adubarym = 0.d0
          end do
        end do
      else if (selectvortscheme .eq. 3) then
        do j = sny+oly-1, 2-oly, -1
          advort3ij = 0.d0
          advort3im = 0.d0
          advort3pj = 0.d0
          advort3pm = 0.d0
          do i = snx+olx-1, 1-olx, -1
            advort3ij = 0.d0
            advort3im = 0.d0
            advort3pj = 0.d0
            advort3pm = 0.d0
            advort3ij = advort3ij-0.25d0*advcoriolisterm(i,j)*recip_dyc(
     $i,j,bi,bj)*masks(i,j,k,bi,bj)
            advort3im = advort3im-0.25d0*advcoriolisterm(i,j)*recip_dyc(
     $i,j,bi,bj)*masks(i,j,k,bi,bj)
            advort3pj = advort3pj-0.25d0*advcoriolisterm(i,j)*recip_dyc(
     $i,j,bi,bj)*masks(i,j,k,bi,bj)
            advort3pm = advort3pm-0.25d0*advcoriolisterm(i,j)*recip_dyc(
     $i,j,bi,bj)*masks(i,j,k,bi,bj)
            advcoriolisterm(i,j) = 0.d0
            adomega3(i+1,j+1) = adomega3(i+1,j+1)+advort3pj*r_hfacz(i+1,
     $j+1)*onethird*ufld(i+1,j)*dyg(i+1,j,bi,bj)*hfacw(i+1,j,k,bi,bj)
            adomega3(i+1,j) = adomega3(i+1,j)+advort3pj*r_hfacz(i+1,j)*
     $onethird*ufld(i+1,j)*dyg(i+1,j,bi,bj)*hfacw(i+1,j,k,bi,bj)
            adomega3(i,j) = adomega3(i,j)+advort3pj*r_hfacz(i,j)*
     $onethird*ufld(i+1,j)*dyg(i+1,j,bi,bj)*hfacw(i+1,j,k,bi,bj)
            adufld(i+1,j) = adufld(i+1,j)+advort3pj*(r_hfacz(i+1,j)*
     $omega3(i+1,j)+r_hfacz(i,j)*omega3(i,j)+r_hfacz(i+1,j+1)*omega3(i+
     $1,j+1))*onethird*dyg(i+1,j,bi,bj)*hfacw(i+1,j,k,bi,bj)
            advort3pj = 0.d0
            adomega3(i+1,j-1) = adomega3(i+1,j-1)+advort3pm*r_hfacz(i+1,
     $j-1)*onethird*ufld(i+1,j-1)*dyg(i+1,j-1,bi,bj)*hfacw(i+1,j-1,k,bi,
     $bj)
            adomega3(i+1,j) = adomega3(i+1,j)+advort3pm*r_hfacz(i+1,j)*
     $onethird*ufld(i+1,j-1)*dyg(i+1,j-1,bi,bj)*hfacw(i+1,j-1,k,bi,bj)
            adomega3(i,j) = adomega3(i,j)+advort3pm*r_hfacz(i,j)*
     $onethird*ufld(i+1,j-1)*dyg(i+1,j-1,bi,bj)*hfacw(i+1,j-1,k,bi,bj)
            adufld(i+1,j-1) = adufld(i+1,j-1)+advort3pm*(r_hfacz(i+1,j)*
     $omega3(i+1,j)+r_hfacz(i,j)*omega3(i,j)+r_hfacz(i+1,j-1)*omega3(i+
     $1,j-1))*onethird*dyg(i+1,j-1,bi,bj)*hfacw(i+1,j-1,k,bi,bj)
            advort3pm = 0.d0
            adomega3(i,j+1) = adomega3(i,j+1)+advort3ij*r_hfacz(i,j+1)*
     $onethird*ufld(i,j)*dyg(i,j,bi,bj)*hfacw(i,j,k,bi,bj)
            adomega3(i+1,j) = adomega3(i+1,j)+advort3ij*r_hfacz(i+1,j)*
     $onethird*ufld(i,j)*dyg(i,j,bi,bj)*hfacw(i,j,k,bi,bj)
            adomega3(i,j) = adomega3(i,j)+advort3ij*r_hfacz(i,j)*
     $onethird*ufld(i,j)*dyg(i,j,bi,bj)*hfacw(i,j,k,bi,bj)
            adufld(i,j) = adufld(i,j)+advort3ij*(r_hfacz(i,j)*omega3(i,
     $j)+r_hfacz(i+1,j)*omega3(i+1,j)+r_hfacz(i,j+1)*omega3(i,j+1))*
     $onethird*dyg(i,j,bi,bj)*hfacw(i,j,k,bi,bj)
            advort3ij = 0.d0
            adomega3(i,j-1) = adomega3(i,j-1)+advort3im*r_hfacz(i,j-1)*
     $onethird*ufld(i,j-1)*dyg(i,j-1,bi,bj)*hfacw(i,j-1,k,bi,bj)
            adomega3(i+1,j) = adomega3(i+1,j)+advort3im*r_hfacz(i+1,j)*
     $onethird*ufld(i,j-1)*dyg(i,j-1,bi,bj)*hfacw(i,j-1,k,bi,bj)
            adomega3(i,j) = adomega3(i,j)+advort3im*r_hfacz(i,j)*
     $onethird*ufld(i,j-1)*dyg(i,j-1,bi,bj)*hfacw(i,j-1,k,bi,bj)
            adufld(i,j-1) = adufld(i,j-1)+advort3im*(r_hfacz(i,j)*
     $omega3(i,j)+r_hfacz(i+1,j)*omega3(i+1,j)+r_hfacz(i,j-1)*omega3(i,
     $j-1))*onethird*dyg(i,j-1,bi,bj)*hfacw(i,j-1,k,bi,bj)
            advort3im = 0.d0
          end do
        end do
      endif

      end

      subroutine admom_vi_v_coriolis_c4( bi, bj, k, ufld, adufld, 
     $omega3, adomega3, r_hfacz, advcoriolisterm )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      logical fourthvort3
      parameter ( fourthvort3 =  .true.  )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      double precision onesixth
      parameter ( onesixth = 1.d0/6.d0 )
      double precision onetwelve
      parameter ( onetwelve = 1.d0/12.d0 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      logical eebooterror
      logical eeenderror
      logical fatalerror
      logical printmapincludeszeros
      logical usecoupler
      logical usecubedsphereexchange
      logical usenest_child
      logical usenest_parent
      logical useoasis
      logical usesetrlstk
      logical usesigreg
      logical usesinglecpuio
      common /eeparams_l/ eebooterror, fatalerror, eeenderror, 
     $usesinglecpuio, printmapincludeszeros, usecubedsphereexchange, 
     $usecoupler, usenest_parent, usenest_child, useoasis, usesetrlstk, 
     $usesigreg

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

C==============================================
C declare arguments
C==============================================
      double precision adomega3(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advcoriolisterm(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k
      double precision omega3(1-olx:snx+olx,1-oly:sny+oly)
      double precision r_hfacz(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)

C==============================================
C declare local variables
C==============================================
      double precision adrjm
      double precision adrjp
      double precision adubarxy
      double precision adubarym
      double precision adubaryp
      double precision advort3r(1-olx:snx+olx,1-oly:sny+oly)
      double precision advort3v
      integer i
      integer ip1
      integer ip2
      integer j
      logical northeastcorner
      logical northwestcorner
      double precision rjm
      double precision rjp
      logical southeastcorner
      logical southwestcorner
      double precision ubarxy
      double precision ubarym
      double precision ubaryp
      double precision vort3r(1-olx:snx+olx,1-oly:sny+oly)
      double precision vort3v

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      adrjm = 0.d0
      adrjp = 0.d0
      adubarxy = 0.d0
      adubarym = 0.d0
      adubaryp = 0.d0
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advort3r(ip1,ip2) = 0.d0
        end do
      end do
      advort3v = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          vort3r(i,j) = r_hfacz(i,j)*omega3(i,j)
        end do
      end do
      if (usecubedsphereexchange .and. highordervorticity) then
        southwestcorner =  .true. 
        southeastcorner =  .true. 
        northwestcorner =  .true. 
        northeastcorner =  .true. 
        if (southwestcorner) then
          i = 1
          j = 1
          vort3r(i-1,j) = (vort3r(i-1,j)+vort3r(i,j+1))*0.5d0
        endif
        if (southeastcorner) then
          i = snx+1
          j = 1
          vort3r(i+1,j) = (vort3r(i+1,j)+vort3r(i,j+1))*0.5d0
        endif
        if (northwestcorner) then
          i = 1
          j = sny+1
          vort3r(i-1,j) = (vort3r(i-1,j)+vort3r(i,j-1))*0.5d0
        endif
        if (northeastcorner) then
          i = snx+1
          j = sny+1
          vort3r(i+1,j) = (vort3r(i+1,j)+vort3r(i,j-1))*0.5d0
        endif
      endif
      if (selectvortscheme .eq. 0) then
        do j = sny+1, 1, -1
          do i = snx, 1, -1
            ubarxy = 0.25*(ufld(i,j)*dyg(i,j,bi,bj)*hfacw(i,j,k,bi,bj)+
     $ufld(i,j-1)*dyg(i,j-1,bi,bj)*hfacw(i,j-1,k,bi,bj)+ufld(i+1,j)*dyg(
     $i+1,j,bi,bj)*hfacw(i+1,j,k,bi,bj)+ufld(i+1,j-1)*dyg(i+1,j-1,bi,bj)
     $*hfacw(i+1,j-1,k,bi,bj))
            if (upwindvorticity) then
              if (ubarxy .gt. 0.) then
                vort3v = vort3r(i,j)
              else
                vort3v = vort3r(i+1,j)
              endif
            else if (fourthvort3) then
              rjp = vort3r(i+2,j)-vort3r(i+1,j)
              rjm = vort3r(i,j)-vort3r(i-1,j)
              vort3v = 0.5*(vort3r(i,j)+vort3r(i+1,j)-onetwelve*(rjp-
     $rjm))
            else
              vort3v = 0.5*(vort3r(i,j)+vort3r(i+1,j))
            endif
            adubarxy = adubarxy-advcoriolisterm(i,j)*vort3v*recip_dyc(i,
     $j,bi,bj)*masks(i,j,k,bi,bj)
            advort3v = advort3v-advcoriolisterm(i,j)*ubarxy*recip_dyc(i,
     $j,bi,bj)*masks(i,j,k,bi,bj)
            advcoriolisterm(i,j) = 0.d0
            if (upwindvorticity) then
              if (ubarxy .gt. 0.) then
                advort3r(i,j) = advort3r(i,j)+advort3v
                advort3v = 0.d0
              else
                advort3r(i+1,j) = advort3r(i+1,j)+advort3v
                advort3v = 0.d0
              endif
            else if (fourthvort3) then
              adrjm = adrjm+0.5*advort3v*onetwelve
              adrjp = adrjp-0.5*advort3v*onetwelve
              advort3r(i+1,j) = advort3r(i+1,j)+0.5*advort3v
              advort3r(i,j) = advort3r(i,j)+0.5*advort3v
              advort3v = 0.d0
              advort3r(i-1,j) = advort3r(i-1,j)-adrjm
              advort3r(i,j) = advort3r(i,j)+adrjm
              adrjm = 0.d0
              advort3r(i+2,j) = advort3r(i+2,j)+adrjp
              advort3r(i+1,j) = advort3r(i+1,j)-adrjp
              adrjp = 0.d0
            else
              advort3r(i+1,j) = advort3r(i+1,j)+0.5*advort3v
              advort3r(i,j) = advort3r(i,j)+0.5*advort3v
              advort3v = 0.d0
            endif
            adufld(i+1,j-1) = adufld(i+1,j-1)+0.25*adubarxy*dyg(i+1,j-1,
     $bi,bj)*hfacw(i+1,j-1,k,bi,bj)
            adufld(i,j-1) = adufld(i,j-1)+0.25*adubarxy*dyg(i,j-1,bi,bj)
     $*hfacw(i,j-1,k,bi,bj)
            adufld(i+1,j) = adufld(i+1,j)+0.25*adubarxy*dyg(i+1,j,bi,bj)
     $*hfacw(i+1,j,k,bi,bj)
            adufld(i,j) = adufld(i,j)+0.25*adubarxy*dyg(i,j,bi,bj)*
     $hfacw(i,j,k,bi,bj)
            adubarxy = 0.d0
          end do
        end do
      else if (selectvortscheme .eq. 2) then
        do j = sny+1, 1, -1
          do i = snx, 1, -1
            ubarym = 0.5*(ufld(i,j)*dyg(i,j,bi,bj)*hfacw(i,j,k,bi,bj)+
     $ufld(i,j-1)*dyg(i,j-1,bi,bj)*hfacw(i,j-1,k,bi,bj))
            ubaryp = 0.5*(ufld(i+1,j)*dyg(i+1,j,bi,bj)*hfacw(i+1,j,k,bi,
     $bj)+ufld(i+1,j-1)*dyg(i+1,j-1,bi,bj)*hfacw(i+1,j-1,k,bi,bj))
            advort3v = advort3v-advcoriolisterm(i,j)*recip_dyc(i,j,bi,
     $bj)*masks(i,j,k,bi,bj)
            advcoriolisterm(i,j) = 0.d0
            if (upwindvorticity) then
              if (ubarym+ubaryp .gt. 0.) then
                adubarym = adubarym+advort3v*vort3r(i,j)
                advort3r(i,j) = advort3r(i,j)+advort3v*ubarym
                advort3v = 0.d0
              else
                adubaryp = adubaryp+advort3v*vort3r(i+1,j)
                advort3r(i+1,j) = advort3r(i+1,j)+advort3v*ubaryp
                advort3v = 0.d0
              endif
            else if (fourthvort3) then
              rjp = vort3r(i+1,j)-onesixth*(vort3r(i+2,j)-vort3r(i,j))
              rjm = vort3r(i,j)+onesixth*(vort3r(i+1,j)-vort3r(i-1,j))
              adrjm = adrjm+0.5*advort3v*ubarym
              adrjp = adrjp+0.5*advort3v*ubaryp
              adubarym = adubarym+0.5*advort3v*rjm
              adubaryp = adubaryp+0.5*advort3v*rjp
              advort3v = 0.d0
              advort3r(i-1,j) = advort3r(i-1,j)-adrjm*onesixth
              advort3r(i+1,j) = advort3r(i+1,j)+adrjm*onesixth
              advort3r(i,j) = advort3r(i,j)+adrjm
              adrjm = 0.d0
              advort3r(i+2,j) = advort3r(i+2,j)-adrjp*onesixth
              advort3r(i+1,j) = advort3r(i+1,j)+adrjp
              advort3r(i,j) = advort3r(i,j)+adrjp*onesixth
              adrjp = 0.d0
            else
              adubarym = adubarym+0.5*advort3v*vort3r(i,j)
              adubaryp = adubaryp+0.5*advort3v*vort3r(i+1,j)
              advort3r(i+1,j) = advort3r(i+1,j)+0.5*advort3v*ubaryp
              advort3r(i,j) = advort3r(i,j)+0.5*advort3v*ubarym
              advort3v = 0.d0
            endif
            adufld(i+1,j-1) = adufld(i+1,j-1)+0.5*adubaryp*dyg(i+1,j-1,
     $bi,bj)*hfacw(i+1,j-1,k,bi,bj)
            adufld(i+1,j) = adufld(i+1,j)+0.5*adubaryp*dyg(i+1,j,bi,bj)*
     $hfacw(i+1,j,k,bi,bj)
            adubaryp = 0.d0
            adufld(i,j-1) = adufld(i,j-1)+0.5*adubarym*dyg(i,j-1,bi,bj)*
     $hfacw(i,j-1,k,bi,bj)
            adufld(i,j) = adufld(i,j)+0.5*adubarym*dyg(i,j,bi,bj)*hfacw(
     $i,j,k,bi,bj)
            adubarym = 0.d0
          end do
        end do
      endif
      if (usecubedsphereexchange .and. highordervorticity) then
        if (northeastcorner) then
          advort3r(i,j-1) = advort3r(i,j-1)+0.5d0*advort3r(i+1,j)
          advort3r(i+1,j) = 0.5d0*advort3r(i+1,j)
        endif
        if (northwestcorner) then
          i = 1
          j = sny+1
          advort3r(i,j-1) = advort3r(i,j-1)+0.5d0*advort3r(i-1,j)
          advort3r(i-1,j) = 0.5d0*advort3r(i-1,j)
        endif
        if (southeastcorner) then
          i = snx+1
          j = 1
          advort3r(i,j+1) = advort3r(i,j+1)+0.5d0*advort3r(i+1,j)
          advort3r(i+1,j) = 0.5d0*advort3r(i+1,j)
        endif
        if (southwestcorner) then
          i = 1
          j = 1
          advort3r(i,j+1) = advort3r(i,j+1)+0.5d0*advort3r(i-1,j)
          advort3r(i-1,j) = 0.5d0*advort3r(i-1,j)
        endif
      endif
      do j = 1-oly, sny+oly
        do i = 1-olx, snx+olx
          adomega3(i,j) = adomega3(i,j)+advort3r(i,j)*r_hfacz(i,j)
          advort3r(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_vi_v_grad_ke( bi, bj, k, adke, addkedy )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

C==============================================
C declare arguments
C==============================================
      double precision addkedy(1-olx:snx+olx,1-oly:sny+oly)
      double precision adke(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = 2-oly, sny+oly
        do i = 1-olx, snx+olx
          adke(i,j-1) = adke(i,j-1)+addkedy(i,j)*recip_dyc(i,j,bi,bj)*
     $masks(i,j,k,bi,bj)
          adke(i,j) = adke(i,j)-addkedy(i,j)*recip_dyc(i,j,bi,bj)*masks(
     $i,j,k,bi,bj)
          addkedy(i,j) = 0.d0
        end do
      end do

      end

      subroutine admom_vi_v_vertshear( bi, bj, k, vfld, advfld, wfld, 
     $adwfld, advshearterm )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

C==============================================
C declare arguments
C==============================================
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advshearterm(1-olx:snx+olx,1-oly:sny+oly)
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      integer k
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)

C==============================================
C declare local variables
C==============================================
      double precision advsheartermh
      double precision advsheartermi
      double precision advzm
      double precision advzp
      double precision adwbarym
      double precision adwbaryp
      integer i
      integer j
      integer km1
      integer kp1
      double precision mask_km1
      double precision mask_kp1
      logical radvareaweight
      double precision vzm
      double precision vzp
      double precision wbarym
      double precision wbaryp

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      advzm = 0.d0
      advzp = 0.d0
      adwbarym = 0.d0
      adwbaryp = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      radvareaweight =  .true. 
      if (selectkescheme .eq. 1 .or. selectkescheme .eq. 3) then
        radvareaweight =  .false. 
      endif
      kp1 = min(k+1,nr)
      mask_kp1 = 1.
      if (k .eq. nr) then
        mask_kp1 = 0.
      endif
      km1 = max(k-1,1)
      mask_km1 = 1.
      if (k .eq. 1) then
        mask_km1 = 0.
      endif
      do j = sny+oly, 2-oly, -1
        do i = snx+olx, 1-olx, -1
          if (radvareaweight) then
            wbarym = 0.5*(wfld(i,j,k,bi,bj)*ra(i,j,bi,bj)*maskc(i,j,km1,
     $bi,bj)+wfld(i,j-1,k,bi,bj)*ra(i,j-1,bi,bj)*maskc(i,j-1,km1,bi,bj))
     $*mask_km1*recip_ras(i,j,bi,bj)
            wbaryp = 0.5*(wfld(i,j,kp1,bi,bj)*ra(i,j,bi,bj)+wfld(i,j-1,
     $kp1,bi,bj)*ra(i,j-1,bi,bj))*mask_kp1*recip_ras(i,j,bi,bj)
          else
            wbarym = 0.5*(wfld(i,j,k,bi,bj)*maskc(i,j,km1,bi,bj)+wfld(i,
     $j-1,k,bi,bj)*maskc(i,j-1,km1,bi,bj))*mask_km1
            wbaryp = 0.5*(wfld(i,j,kp1,bi,bj)+wfld(i,j-1,kp1,bi,bj))*
     $mask_kp1
          endif
          vzm = (vfld(i,j,k,bi,bj)-mask_km1*vfld(i,j,km1,bi,bj))*rksign
          vzp = (mask_kp1*vfld(i,j,kp1,bi,bj)-vfld(i,j,k,bi,bj))*rksign
          if (upwindshear) then
            advsheartermh = 0.5*advshearterm(i,j)*vzm*recip_hfacs(i,j,k,
     $bi,bj)*recip_drf(k)
            advsheartermi = -(0.5*advshearterm(i,j)*vzp*recip_hfacs(i,j,
     $k,bi,bj)*recip_drf(k))
            advzm = advzm-0.5*advshearterm(i,j)*(wbarym-abs(wbarym))*
     $recip_hfacs(i,j,k,bi,bj)*recip_drf(k)
            advzp = advzp-0.5*advshearterm(i,j)*(wbaryp+abs(wbaryp))*
     $recip_hfacs(i,j,k,bi,bj)*recip_drf(k)
            adwbarym = adwbarym-0.5*advshearterm(i,j)*vzm*recip_hfacs(i,
     $j,k,bi,bj)*recip_drf(k)
            adwbaryp = adwbaryp-0.5*advshearterm(i,j)*vzp*recip_hfacs(i,
     $j,k,bi,bj)*recip_drf(k)
            adwbaryp = adwbaryp+advsheartermi*sign(1.d0,wbaryp)
            adwbarym = adwbarym+advsheartermh*sign(1.d0,wbarym)
            advshearterm(i,j) = 0.d0
          else
            advzm = advzm-0.5*advshearterm(i,j)*wbarym*recip_hfacs(i,j,
     $k,bi,bj)*recip_drf(k)
            advzp = advzp-0.5*advshearterm(i,j)*wbaryp*recip_hfacs(i,j,
     $k,bi,bj)*recip_drf(k)
            adwbarym = adwbarym-0.5*advshearterm(i,j)*vzm*recip_hfacs(i,
     $j,k,bi,bj)*recip_drf(k)
            adwbaryp = adwbaryp-0.5*advshearterm(i,j)*vzp*recip_hfacs(i,
     $j,k,bi,bj)*recip_drf(k)
            advshearterm(i,j) = 0.d0
          endif
          advfld(i,j,k,bi,bj) = advfld(i,j,k,bi,bj)-advzp*rksign
          advfld(i,j,kp1,bi,bj) = advfld(i,j,kp1,bi,bj)+advzp*mask_kp1*
     $rksign
          advzp = 0.d0
          advfld(i,j,k,bi,bj) = advfld(i,j,k,bi,bj)+advzm*rksign
          advfld(i,j,km1,bi,bj) = advfld(i,j,km1,bi,bj)-advzm*mask_km1*
     $rksign
          advzm = 0.d0
          if (radvareaweight) then
            adwfld(i,j-1,kp1,bi,bj) = adwfld(i,j-1,kp1,bi,bj)+0.5*
     $adwbaryp*ra(i,j-1,bi,bj)*mask_kp1*recip_ras(i,j,bi,bj)
            adwfld(i,j,kp1,bi,bj) = adwfld(i,j,kp1,bi,bj)+0.5*adwbaryp*
     $ra(i,j,bi,bj)*mask_kp1*recip_ras(i,j,bi,bj)
            adwbaryp = 0.d0
            adwfld(i,j-1,k,bi,bj) = adwfld(i,j-1,k,bi,bj)+0.5*adwbarym*
     $ra(i,j-1,bi,bj)*maskc(i,j-1,km1,bi,bj)*mask_km1*recip_ras(i,j,bi,
     $bj)
            adwfld(i,j,k,bi,bj) = adwfld(i,j,k,bi,bj)+0.5*adwbarym*ra(i,
     $j,bi,bj)*maskc(i,j,km1,bi,bj)*mask_km1*recip_ras(i,j,bi,bj)
            adwbarym = 0.d0
          else
            adwfld(i,j-1,kp1,bi,bj) = adwfld(i,j-1,kp1,bi,bj)+0.5*
     $adwbaryp*mask_kp1
            adwfld(i,j,kp1,bi,bj) = adwfld(i,j,kp1,bi,bj)+0.5*adwbaryp*
     $mask_kp1
            adwbaryp = 0.d0
            adwfld(i,j-1,k,bi,bj) = adwfld(i,j-1,k,bi,bj)+0.5*adwbarym*
     $maskc(i,j-1,km1,bi,bj)*mask_km1
            adwfld(i,j,k,bi,bj) = adwfld(i,j,k,bi,bj)+0.5*adwbarym*
     $maskc(i,j,km1,bi,bj)*mask_km1
            adwbarym = 0.d0
          endif
        end do
      end do

      end

      subroutine admomentum_correction_step( mytime, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      integer mythid
      double precision mytime

C==============================================
C declare local variables
C==============================================
      double precision adphisurfx(1-olx:snx+olx,1-oly:sny+oly)
      double precision adphisurfy(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer imax
      integer imin
      integer ip1
      integer ip2
      integer jmax
      integer jmin
      integer k

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adphisurfx(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adphisurfy(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (implicitintgravwave) then
        call adexch_xyz_rl( adwvel,mythid )
      endif
      if (exactconserv .and. implicdiv2dflow .ne. 0.d0) then
        call adexch_xy_rl( adetan,mythid )
      endif
      do bj = mybyhi(mythid), mybylo(mythid), -1
        do bi = mybxhi(mythid), mybxlo(mythid), -1
          call adintegr_continuity( bi,bj,aduvel,advvel,mytime )
        end do
      end do
      do bj = mybyhi(mythid), mybylo(mythid), -1
        do bi = mybxhi(mythid), mybxlo(mythid), -1
          imin = 1-olx+1
          imax = snx+olx
          jmin = 1-oly+1
          jmax = sny+oly
          do k = nr, 1, -1
            if (momstepping) then
              call adcorrection_step( bi,bj,imin,imax,jmin,jmax,k,
     $adphisurfx,adphisurfy )
            endif
          end do
          call adcalc_grad_phi_surf( bi,bj,imin,imax,jmin,jmax,adetan,
     $adphisurfx,adphisurfy )
        end do
      end do

      end

      subroutine adpackages_init_variables( mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare common blocks
C==============================================
C==============================================
C declare arguments
C==============================================
      integer mythid

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      call barrier( mythid )
      call barrier( mythid )
      call adcost_init_varia
      call barrier( mythid )

      end

      subroutine mdpackages_init_variables( mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

C==============================================
C declare arguments
C==============================================
      integer mythid

C**********************************************
C executable statements of routine
C**********************************************
      if (usecdscheme) then
        call cd_code_ini_vars( mythid )
      endif
      call adwrite( 'tapelev_init_1_the_main_loop_theta',34,13,1,theta,
     $8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,1 )
      call barrier( mythid )
      call cost_init_varia( mythid )
      call barrier( mythid )
      end

      subroutine adpressure_for_eos( bi, bj, k, adlocpres )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adrhoinsitu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision adtotphihyd(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      common /addynvars_diag/ adtotphihyd, adrhoinsitu

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      double precision adlocpres(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer k

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (usingzcoords) then
        if (usedynp_ineos_zc) then
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              adtotphihyd(i,j,k,bi,bj) = adtotphihyd(i,j,k,bi,bj)+
     $adlocpres(i,j)*rhoconst
              adlocpres(i,j) = 0.d0
            end do
          end do
        endif
      endif

      end

      subroutine adread_rec_xy_rs( adfield )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
C==============================================
C declare arguments
C==============================================
      double precision adfield(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)

C==============================================
C declare local variables
C==============================================
      integer ip1
      integer ip2
      integer ip3
      integer ip4

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adfield(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do

      end

      subroutine adsolve_for_pressure( mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetanm1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduveld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advveld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_cd/ aduveld, advveld, adetanm1, adunm1, advnm1

      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision adetah(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /addynvars_r_2/ adetah

      double precision adempmr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adffields_empmr/ adempmr

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      double precision empmr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /ffields_empmr/ empmr

      integer klowc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      integer ksurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_i/ ksurfc, ksurfw, ksurfs, klowc

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      double precision bo_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision phi0surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_bo(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision topoz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /surf_fixed/ bo_surf, recip_bo, topoz, phi0surf

C==============================================
C declare arguments
C==============================================
      integer mythid

C==============================================
C declare local variables
C==============================================
      double precision adcg2d_b(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adcg2d_bh(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adcg2d_x(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adsumemp
      double precision adtileemp(nsx,nsy)
      double precision adtmpfac
      integer bi
      integer bj
      double precision firstresidual
      integer i
      integer ip1
      integer ip2
      integer ip3
      integer ip4
      integer j
      integer k
      integer ks
      double precision lastresidual
      integer numiters
      logical putpmeinxvector
      double precision tmpfac

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adcg2d_b(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adcg2d_bh(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adcg2d_x(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      adsumemp = 0.d0
      do ip2 = 1, nsy
        do ip1 = 1, nsx
          adtileemp(ip1,ip2) = 0.d0
        end do
      end do
      adtmpfac = 0.d0

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      putpmeinxvector =  .false. 
      firstresidual = 0.
      lastresidual = 0.
      numiters = cg2dmaxiters
      do bj = mybylo(mythid), mybyhi(mythid)
        do bi = mybxlo(mythid), mybxhi(mythid)
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              adcg2d_x(i,j,bi,bj) = adcg2d_x(i,j,bi,bj)+adetan(i,j,bi,
     $bj)*recip_bo(i,j,bi,bj)
              adetan(i,j,bi,bj) = 0.d0
            end do
          end do
        end do
      end do
      call adexch_xy_rl( adcg2d_x,mythid )
      if ( .true. ) then
        call cg2d( adcg2d_x,adcg2d_bh,firstresidual,lastresidual,
     $numiters,mythid )
        do ip4 = 1, nsy
          do ip3 = 1, nsx
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adcg2d_b(ip1,ip2,ip3,ip4) = adcg2d_b(ip1,ip2,ip3,ip4)+
     $adcg2d_bh(ip1,ip2,ip3,ip4)
              end do
            end do
          end do
        end do
        do ip4 = 1, nsy
          do ip3 = 1, nsx
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adcg2d_x(ip1,ip2,ip3,ip4) = 0.d0
              end do
            end do
          end do
        end do
      endif
      do bj = mybyhi(mythid), mybylo(mythid), -1
        do bi = mybxhi(mythid), mybxlo(mythid), -1
          if (exactconserv) then
            do j = 1, sny
              do i = 1, snx
                ks = ksurfc(i,j,bi,bj)
                adetah(i,j,bi,bj) = adetah(i,j,bi,bj)-adcg2d_b(i,j,bi,
     $bj)*(freesurffac*ra(i,j,bi,bj)*deepfac2f(ks)/deltatmom/
     $deltatfreesurf)
              end do
            end do
          else
            do j = 1, sny
              do i = 1, snx
                ks = ksurfc(i,j,bi,bj)
                adetan(i,j,bi,bj) = adetan(i,j,bi,bj)-adcg2d_b(i,j,bi,
     $bj)*(freesurffac*ra(i,j,bi,bj)*deepfac2f(ks)/deltatmom/
     $deltatfreesurf)
              end do
            end do
          endif
        end do
      end do
      do bj = mybyhi(mythid), mybylo(mythid), -1
        do bi = mybxhi(mythid), mybxlo(mythid), -1
          do k = 1, nr
            call adcalc_div_ghat( bi,bj,k,adcg2d_b )
          end do
          if (putpmeinxvector) then
            do j = 1, sny
              do i = 1, snx
                adtmpfac = adtmpfac-adcg2d_x(i,j,bi,bj)*bo_surf(i,j,bi,
     $bj)
              end do
            end do
            if (globalarea .gt. 0.) then
              adsumemp = adsumemp+adtmpfac*(freesurffac*deltatfreesurf*
     $mass2runit/globalarea)
              adtmpfac = 0.d0
            endif
            adtmpfac = 0.d0
          endif
        end do
      end do
      if (putpmeinxvector) then
        call global_adsum_tile_rl( adtileemp,adsumemp,mythid )
      endif
      do bj = mybyhi(mythid), mybylo(mythid), -1
        do bi = mybxhi(mythid), mybxlo(mythid), -1
          if (putpmeinxvector) then
            do j = 1, sny
              do i = 1, snx
                adempmr(i,j,bi,bj) = adempmr(i,j,bi,bj)+adtileemp(bi,bj)
     $*ra(i,j,bi,bj)*maskinc(i,j,bi,bj)
              end do
            end do
            adtileemp(bi,bj) = 0.d0
          endif
          if (userealfreshwaterflux .and. fluidiswater) then
            tmpfac = freesurffac*mass2runit
            if (exactconserv) then
              tmpfac = freesurffac*mass2runit*implicdiv2dflow
            endif
            do j = 1, sny
              do i = 1, snx
                adempmr(i,j,bi,bj) = adempmr(i,j,bi,bj)+adcg2d_b(i,j,bi,
     $bj)*(tmpfac*ra(i,j,bi,bj)/deltatmom)
                adtmpfac = adtmpfac+adcg2d_b(i,j,bi,bj)*(ra(i,j,bi,bj)*
     $empmr(i,j,bi,bj)/deltatmom)
                adcg2d_b(i,j,bi,bj) = 0.d0
              end do
            end do
          endif
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              adcg2d_b(i,j,bi,bj) = 0.d0
              adetan(i,j,bi,bj) = adetan(i,j,bi,bj)+adcg2d_x(i,j,bi,bj)*
     $bo_surf(i,j,bi,bj)
              adcg2d_x(i,j,bi,bj) = 0.d0
              adetan(i,j,bi,bj) = adetan(i,j,bi,bj)+adetanm1(i,j,bi,bj)
              adetanm1(i,j,bi,bj) = 0.d0
            end do
          end do
        end do
      end do

      end

      subroutine adthe_main_loop( mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nchklev_1
      parameter ( nchklev_1 = 30 )
      integer nchklev_2
      parameter ( nchklev_2 = 5 )
      integer nchklev_3
      parameter ( nchklev_3 = 5 )
      integer ndv2d
      parameter ( ndv2d = 23 )
      integer ndv3d
      parameter ( ndv3d = 12 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision storedynvars2d(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy,ndv2d)
      double precision storedynvars3d(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy,ndv3d)
      common /autodiff_store_dyn/ storedynvars3d, storedynvars2d

      double precision cmeantheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision cmeanthetauvel(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy)
      double precision cmeanthetavvel(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy)
      double precision cmeanuvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision cmeanvvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /cost_mean_r/ cmeantheta, cmeanuvel, cmeanvvel, 
     $cmeanthetauvel, cmeanthetavvel

      double precision etanm1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision unm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uveld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vveld(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_cd/ uveld, vveld, etanm1, unm1, vnm1

      double precision qnetm(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /mean_qnet/ qnetm

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      integer mythid

C==============================================
C declare local variables
C==============================================
      integer ilev_1
      integer ilev_2
      integer ilev_3
      integer iloop
      integer max_lev2
      integer max_lev3
      integer myiter
      double precision mytime

C----------------------------------------------
C RESET GLOBAL ADJOINT VARIABLES
C----------------------------------------------
      call adzero

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
C----------------------------------------------
C OPEN TAPE tapelev3
C----------------------------------------------
      call adopen( 'tapelev3_1_the_main_loop_storedynvars2d',39,15,1,8,
     $108192 )
      call adopen( 'tapelev3_2_the_main_loop_storedynvars3d',39,15,2,8,
     $846720 )
      call adopen( 'tapelev3_3_the_main_loop_uveld',30,15,3,8,70560 )
      call adopen( 'tapelev3_4_the_main_loop_vveld',30,15,4,8,70560 )
      call adopen( 'tapelev3_5_the_main_loop_etanm1',31,15,5,8,4704 )
      call adopen( 'tapelev3_6_the_main_loop_unm1',29,15,6,8,70560 )
      call adopen( 'tapelev3_7_the_main_loop_vnm1',29,15,7,8,70560 )
      call adopen( 'tapelev3_8_the_main_loop_cmeantheta',35,15,8,8,
     $70560 )
      call adopen( 'tapelev3_13_the_main_loop_qnetm',31,15,13,8,4704 )

C----------------------------------------------
C FUNCTION AND TAPE COMPUTATIONS
C----------------------------------------------
      call initialise_varia( mythid )
      max_lev3 = ntimesteps/(nchklev_1*nchklev_2)+1
      max_lev2 = ntimesteps/nchklev_1+1
      do ilev_3 = 1, nchklev_3
        if (ilev_3 .le. max_lev3) then
          call autodiff_store( mythid )
          call adwrite( 'tapelev3_1_the_main_loop_storedynvars2d',39,15,
     $1,storedynvars2d,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nsx*
     $nsy*ndv2d,ilev_3 )
          call adwrite( 'tapelev3_2_the_main_loop_storedynvars3d',39,15,
     $2,storedynvars3d,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*
     $nsy*ndv3d,ilev_3 )
          call adwrite( 'tapelev3_3_the_main_loop_uveld',30,15,3,uveld,
     $8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_3 )
          call adwrite( 'tapelev3_4_the_main_loop_vveld',30,15,4,vveld,
     $8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_3 )
          call adwrite( 'tapelev3_5_the_main_loop_etanm1',31,15,5,
     $etanm1,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nsx*nsy,ilev_3 )
          call adwrite( 'tapelev3_6_the_main_loop_unm1',29,15,6,unm1,8,(
     $1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_3 )
          call adwrite( 'tapelev3_7_the_main_loop_vnm1',29,15,7,vnm1,8,(
     $1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_3 )
          call adwrite( 'tapelev3_8_the_main_loop_cmeantheta',35,15,8,
     $cmeantheta,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,
     $ilev_3 )
          call adwrite( 'tapelev3_13_the_main_loop_qnetm',31,15,13,
     $qnetm,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nsx*nsy,ilev_3 )
          call autodiff_restore( mythid )
          do ilev_2 = 1, nchklev_2
            if (ilev_2 .le. max_lev2) then
              call autodiff_store( mythid )
              call autodiff_restore( mythid )
              do ilev_1 = 1, nchklev_1
                iloop = (ilev_2-1)*nchklev_1+ilev_1+(ilev_3-1)*
     $nchklev_2*nchklev_1
                if (iloop .le. ntimesteps) then
                  niter0 = nint((starttime-basetime)/deltatclock)
                  ikey_dynamics = ilev_1
                  call forward_step( iloop,mytime,myiter,mythid )
                endif
              end do
            endif
          end do
        endif
      end do
      call cost_final( mythid )
      call barrier( mythid )

C----------------------------------------------
C ADJOINT COMPUTATIONS
C----------------------------------------------
      call barrier( mythid )
      call adcost_final( mythid )
      do ilev_3 = nchklev_3, 1, -1
        if (ilev_3 .le. max_lev3) then
          call adread( 'tapelev3_1_the_main_loop_storedynvars2d',39,15,
     $1,storedynvars2d,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nsx*
     $nsy*ndv2d,ilev_3 )
          call adread( 'tapelev3_2_the_main_loop_storedynvars3d',39,15,
     $2,storedynvars3d,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*
     $nsy*ndv3d,ilev_3 )
          call adread( 'tapelev3_3_the_main_loop_uveld',30,15,3,uveld,8,
     $(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_3 )
          call adread( 'tapelev3_4_the_main_loop_vveld',30,15,4,vveld,8,
     $(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_3 )
          call adread( 'tapelev3_5_the_main_loop_etanm1',31,15,5,etanm1,
     $8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nsx*nsy,ilev_3 )
          call adread( 'tapelev3_6_the_main_loop_unm1',29,15,6,unm1,8,(
     $1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_3 )
          call adread( 'tapelev3_7_the_main_loop_vnm1',29,15,7,vnm1,8,(
     $1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_3 )
          call adread( 'tapelev3_8_the_main_loop_cmeantheta',35,15,8,
     $cmeantheta,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,
     $ilev_3 )
          call adread( 'tapelev3_13_the_main_loop_qnetm',31,15,13,qnetm,
     $8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nsx*nsy,ilev_3 )
          call autodiff_restore( mythid )
C----------------------------------------------
C OPEN TAPE tapelev2
C----------------------------------------------
          call adopen( 'tapelev2_1_the_main_loop_storedynvars2d',39,16,
     $1,8,108192 )
          call adopen( 'tapelev2_2_the_main_loop_storedynvars3d',39,16,
     $2,8,846720 )
          call adopen( 'tapelev2_3_the_main_loop_uveld',30,16,3,8,70560 
     $)
          call adopen( 'tapelev2_4_the_main_loop_vveld',30,16,4,8,70560 
     $)
          call adopen( 'tapelev2_5_the_main_loop_etanm1',31,16,5,8,4704 
     $)
          call adopen( 'tapelev2_6_the_main_loop_unm1',29,16,6,8,70560 )
          call adopen( 'tapelev2_7_the_main_loop_vnm1',29,16,7,8,70560 )
          call adopen( 'tapelev2_8_the_main_loop_cmeantheta',35,16,8,8,
     $70560 )
          call adopen( 'tapelev2_13_the_main_loop_qnetm',31,16,13,8,
     $4704 )

C----------------------------------------------
C TAPE COMPUTATIONS
C----------------------------------------------
          do ilev_2 = 1, nchklev_2-1
            if (ilev_2 .le. max_lev2) then
              call autodiff_store( mythid )
              call adwrite( 'tapelev2_1_the_main_loop_storedynvars2d',
     $39,16,1,storedynvars2d,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*
     $nsx*nsy*ndv2d,ilev_2 )
              call adwrite( 'tapelev2_2_the_main_loop_storedynvars3d',
     $39,16,2,storedynvars3d,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*
     $nr*nsx*nsy*ndv3d,ilev_2 )
              call adwrite( 'tapelev2_3_the_main_loop_uveld',30,16,3,
     $uveld,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_2 
     $)
              call adwrite( 'tapelev2_4_the_main_loop_vveld',30,16,4,
     $vveld,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_2 
     $)
              call adwrite( 'tapelev2_5_the_main_loop_etanm1',31,16,5,
     $etanm1,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nsx*nsy,ilev_2 )
              call adwrite( 'tapelev2_6_the_main_loop_unm1',29,16,6,
     $unm1,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_2 )
              call adwrite( 'tapelev2_7_the_main_loop_vnm1',29,16,7,
     $vnm1,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_2 )
              call adwrite( 'tapelev2_8_the_main_loop_cmeantheta',35,16,
     $8,cmeantheta,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,
     $ilev_2 )
              call adwrite( 'tapelev2_13_the_main_loop_qnetm',31,16,13,
     $qnetm,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nsx*nsy,ilev_2 )
              call autodiff_restore( mythid )
              do ilev_1 = 1, nchklev_1
                iloop = (ilev_2-1)*nchklev_1+ilev_1+(ilev_3-1)*
     $nchklev_2*nchklev_1
                if (iloop .le. ntimesteps) then
                  niter0 = nint((starttime-basetime)/deltatclock)
                  ikey_dynamics = ilev_1
                  call forward_step( iloop,mytime,myiter,mythid )
                endif
              end do
            endif
          end do
          ilev_2 = nchklev_2
          if (ilev_2 .le. max_lev2) then
            call autodiff_store( mythid )
            call adwrite( 'tapelev2_1_the_main_loop_storedynvars2d',39,
     $16,1,storedynvars2d,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nsx*
     $nsy*ndv2d,ilev_2 )
            call adwrite( 'tapelev2_2_the_main_loop_storedynvars3d',39,
     $16,2,storedynvars3d,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*
     $nsx*nsy*ndv3d,ilev_2 )
            call adwrite( 'tapelev2_3_the_main_loop_uveld',30,16,3,
     $uveld,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_2 
     $)
            call adwrite( 'tapelev2_4_the_main_loop_vveld',30,16,4,
     $vveld,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_2 
     $)
            call adwrite( 'tapelev2_5_the_main_loop_etanm1',31,16,5,
     $etanm1,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nsx*nsy,ilev_2 )
            call adwrite( 'tapelev2_6_the_main_loop_unm1',29,16,6,unm1,
     $8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_2 )
            call adwrite( 'tapelev2_7_the_main_loop_vnm1',29,16,7,vnm1,
     $8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_2 )
            call adwrite( 'tapelev2_8_the_main_loop_cmeantheta',35,16,8,
     $cmeantheta,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,
     $ilev_2 )
            call adwrite( 'tapelev2_13_the_main_loop_qnetm',31,16,13,
     $qnetm,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nsx*nsy,ilev_2 )
          endif

C----------------------------------------------
C ADJOINT COMPUTATIONS
C----------------------------------------------
          do ilev_2 = nchklev_2, 1, -1
            if (ilev_2 .le. max_lev2) then
              call adread( 'tapelev2_1_the_main_loop_storedynvars2d',39,
     $16,1,storedynvars2d,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nsx*
     $nsy*ndv2d,ilev_2 )
              call adread( 'tapelev2_2_the_main_loop_storedynvars3d',39,
     $16,2,storedynvars3d,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*
     $nsx*nsy*ndv3d,ilev_2 )
              call adread( 'tapelev2_3_the_main_loop_uveld',30,16,3,
     $uveld,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_2 
     $)
              call adread( 'tapelev2_4_the_main_loop_vveld',30,16,4,
     $vveld,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_2 
     $)
              call adread( 'tapelev2_5_the_main_loop_etanm1',31,16,5,
     $etanm1,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nsx*nsy,ilev_2 )
              call adread( 'tapelev2_6_the_main_loop_unm1',29,16,6,unm1,
     $8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_2 )
              call adread( 'tapelev2_7_the_main_loop_vnm1',29,16,7,vnm1,
     $8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,ilev_2 )
              call adread( 'tapelev2_8_the_main_loop_cmeantheta',35,16,
     $8,cmeantheta,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nr*nsx*nsy,
     $ilev_2 )
              call adread( 'tapelev2_13_the_main_loop_qnetm',31,16,13,
     $qnetm,8,(1+snx+olx-(1-olx))*(1+sny+oly-(1-oly))*nsx*nsy,ilev_2 )
              call autodiff_restore( mythid )
C----------------------------------------------
C TAPE COMPUTATIONS
C----------------------------------------------
              do ilev_1 = 1, nchklev_1
                iloop = (ilev_2-1)*nchklev_1+ilev_1+(ilev_3-1)*
     $nchklev_2*nchklev_1
                if (iloop .le. ntimesteps) then
                  niter0 = nint((starttime-basetime)/deltatclock)
                  ikey_dynamics = ilev_1
                  call mdforward_step( iloop,mytime,myiter,mythid )
                endif
              end do

C----------------------------------------------
C ADJOINT COMPUTATIONS
C----------------------------------------------
              do ilev_1 = nchklev_1, 1, -1
                iloop = (ilev_2-1)*nchklev_1+ilev_1+(ilev_3-1)*
     $nchklev_2*nchklev_1
                if (iloop .le. ntimesteps) then
                  niter0 = nint((starttime-basetime)/deltatclock)
                  ikey_dynamics = ilev_1
                  call adforward_step( iloop,mythid )
                endif
              end do
              call adautodiff_restore( mythid )
              call adautodiff_store( mythid )
            endif
          end do
C----------------------------------------------
C CLOSE TAPE tapelev2
C----------------------------------------------
          call adclose( 'tapelev2_1_the_main_loop_storedynvars2d',39,16,
     $1,8,108192 )
          call adclose( 'tapelev2_2_the_main_loop_storedynvars3d',39,16,
     $2,8,846720 )
          call adclose( 'tapelev2_3_the_main_loop_uveld',30,16,3,8,
     $70560 )
          call adclose( 'tapelev2_4_the_main_loop_vveld',30,16,4,8,
     $70560 )
          call adclose( 'tapelev2_5_the_main_loop_etanm1',31,16,5,8,
     $4704 )
          call adclose( 'tapelev2_6_the_main_loop_unm1',29,16,6,8,70560 
     $)
          call adclose( 'tapelev2_7_the_main_loop_vnm1',29,16,7,8,70560 
     $)
          call adclose( 'tapelev2_8_the_main_loop_cmeantheta',35,16,8,8,
     $70560 )
          call adclose( 'tapelev2_13_the_main_loop_qnetm',31,16,13,8,
     $4704 )

          call adautodiff_restore( mythid )
          call adautodiff_store( mythid )
        endif
      end do
      call adinitialise_varia( mythid )
C----------------------------------------------
C CLOSE TAPE tapelev3
C----------------------------------------------
      call adclose( 'tapelev3_1_the_main_loop_storedynvars2d',39,15,1,8,
     $108192 )
      call adclose( 'tapelev3_2_the_main_loop_storedynvars3d',39,15,2,8,
     $846720 )
      call adclose( 'tapelev3_3_the_main_loop_uveld',30,15,3,8,70560 )
      call adclose( 'tapelev3_4_the_main_loop_vveld',30,15,4,8,70560 )
      call adclose( 'tapelev3_5_the_main_loop_etanm1',31,15,5,8,4704 )
      call adclose( 'tapelev3_6_the_main_loop_unm1',29,15,6,8,70560 )
      call adclose( 'tapelev3_7_the_main_loop_vnm1',29,15,7,8,70560 )
      call adclose( 'tapelev3_8_the_main_loop_cmeantheta',35,15,8,8,
     $70560 )
      call adclose( 'tapelev3_13_the_main_loop_qnetm',31,15,13,8,4704 )


      end

      subroutine adthermodynamics( myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer gad_salinity
      parameter ( gad_salinity = 2 )
      integer gad_temperature
      parameter ( gad_temperature = 1 )
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision adssurfcor
      double precision adtsurfcor
      common /adsurf_correc/ adtsurfcor, adssurfcor

      real*8 comlev1_bibj_gs_34h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadgs/ comlev1_bibj_gs_34h

      real*8 comlev1_bibj_k_gsnm1_68h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadgsnm1/ comlev1_bibj_k_gsnm1_68h

      real*8 comlev1_bibj_gt_32h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadgt/ comlev1_bibj_gt_32h

      real*8 comlev1_bibj_k_gtnm1_67h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadgtnm1/ comlev1_bibj_k_gtnm1_67h

      real*8 comlev1_bibj_k_gt_69h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadgu/ comlev1_bibj_k_gt_69h

      real*8 comlev1_bibj_kappark_33h(1-olx:snx+olx,1-oly:sny+oly,nr,
     $120)
      common /cadkappark/ comlev1_bibj_kappark_33h

      real*8 comlev1_bibj_kappark_31h(1-olx:snx+olx,1-oly:sny+oly,nr,
     $120)
      common /cadkapparl/ comlev1_bibj_kappark_31h

      real*8 comlev1_bibj_k_kappars_66h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadkappars/ comlev1_bibj_k_kappars_66h

      real*8 comlev1_bibj_k_kappart_65h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadkappart/ comlev1_bibj_k_kappart_65h

      real*8 comlev1_bibj_k_rtrans_63h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadrtrans/ comlev1_bibj_k_rtrans_63h

      real*8 comlev1_bibj_k_rtranskp1_62h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadrtranskp1/ comlev1_bibj_k_rtranskp1_62h

      real*8 comlev1_bibj_salt_28h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadsalw/ comlev1_bibj_salt_28h

      real*8 comlev1_salt_47h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /cadsalx/ comlev1_salt_47h

      real*8 comlev1_bibj_theta_27h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadthete/ comlev1_bibj_theta_27h

      real*8 comlev1_theta_46h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,
     $30)
      common /cadthetf/ comlev1_theta_46h

      real*8 comlev1_bibj_uvel_29h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /caduvem/ comlev1_bibj_uvel_29h

      real*8 comlev1_bibj_vvel_30h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadvvem/ comlev1_bibj_vvel_30h

      real*8 comlev1_bibj_k_wfld_64h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadwfld/ comlev1_bibj_k_wfld_64h

      real*8 comlev1_bibj_wvel_26h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadwvel/ comlev1_bibj_wvel_26h

      real*8 comlev1_wvel_48h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /cadwvem/ comlev1_wvel_48h

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      logical adamsbashforth_s
      logical adamsbashforth_t
      logical adamsbashforthgs
      logical adamsbashforthgt
      logical saltmultidimadvec
      logical saltsom_advection
      logical tempmultidimadvec
      logical tempsom_advection
      common /gad_parm_l/ tempsom_advection, saltsom_advection, 
     $tempmultidimadvec, saltmultidimadvec, adamsbashforthgt, 
     $adamsbashforthgs, adamsbashforth_t, adamsbashforth_s

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      integer myiter
      integer mythid

C==============================================
C declare local variables
C==============================================
      integer act1
      integer act2
      integer act3
      integer act4
      double precision adfvers(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision adfvert(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision adkappark(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision adkappars(1-olx:snx+olx,1-oly:sny+oly)
      double precision adkappart(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adrtranskp1(1-olx:snx+olx,1-oly:sny+oly)
      double precision adufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision adutrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision advfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision advtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision adwfld(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer i
      integer imax
      integer imin
      integer ip1
      integer ip2
      integer ip3
      integer ip4
      integer ip5
      integer itdkey
      integer j
      integer jmax
      integer jmin
      integer k
      double precision kappark(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision kappars(1-olx:snx+olx,1-oly:sny+oly)
      double precision kappart(1-olx:snx+olx,1-oly:sny+oly)
      integer kdown
      integer kkey
      integer kup
      double precision maskup(1-olx:snx+olx,1-oly:sny+oly)
      integer max1
      integer max2
      integer max3
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision rtranskp1(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip3 = 1, 2
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            adfvers(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do
      do ip3 = 1, 2
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            adfvert(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do
      do ip3 = 1, nr
        do ip2 = 1-oly, sny+oly
          do ip1 = 1-olx, snx+olx
            adkappark(ip1,ip2,ip3) = 0.d0
          end do
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adkappars(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adkappart(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adrtrans(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adrtranskp1(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adufld(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adutrans(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advfld(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          advtrans(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adwfld(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do bj = mybyhi(mythid), mybylo(mythid), -1
        do bi = mybxhi(mythid), mybxlo(mythid), -1
          act1 = bi-mybxlo(mythid)
          max1 = mybxhi(mythid)-mybxlo(mythid)+1
          act2 = bj-mybylo(mythid)
          max2 = mybyhi(mythid)-mybylo(mythid)+1
          act3 = mythid-1
          max3 = ntx*nty
          act4 = ikey_dynamics-1
          itdkey = act1+1+act2*max1+act3*max1*max2+act4*max1*max2*max3
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                wvel(ip1,ip2,ip3,bi,bj) = comlev1_bibj_wvel_26h(ip1,ip2,
     $ip3,itdkey)
              end do
            end do
          end do
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                theta(ip1,ip2,ip3,bi,bj) = comlev1_bibj_theta_27h(ip1,
     $ip2,ip3,itdkey)
              end do
            end do
          end do
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                salt(ip1,ip2,ip3,bi,bj) = comlev1_bibj_salt_28h(ip1,ip2,
     $ip3,itdkey)
              end do
            end do
          end do
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                uvel(ip1,ip2,ip3,bi,bj) = comlev1_bibj_uvel_29h(ip1,ip2,
     $ip3,itdkey)
              end do
            end do
          end do
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                vvel(ip1,ip2,ip3,bi,bj) = comlev1_bibj_vvel_30h(ip1,ip2,
     $ip3,itdkey)
              end do
            end do
          end do
          imin = 1
          imax = snx
          jmin = 1
          jmax = sny
          if (saltstepping .and. implicitdiffusion) then
            do ip3 = 1, nr
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  kappark(ip1,ip2,ip3) = comlev1_bibj_kappark_33h(ip1,
     $ip2,ip3,itdkey)
                end do
              end do
            end do
            do ip3 = 1, nr
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  gs(ip1,ip2,ip3,bi,bj) = comlev1_bibj_gs_34h(ip1,ip2,
     $ip3,itdkey)
                end do
              end do
            end do
            call adimpldiff( bi,bj,imin,imax,jmin,jmax,gad_salinity,
     $kappark,adkappark,recip_hfacc,gs,adgs )
          endif
          if (saltstepping .and. implicitdiffusion) then
            call adcalc_3d_diffusivity( bi,bj,imin,imax,jmin,jmax,
     $gad_salinity,usegmredi,usekpp,adkappark )
          endif
          if (tempstepping .and. implicitdiffusion) then
            do ip3 = 1, nr
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  kappark(ip1,ip2,ip3) = comlev1_bibj_kappark_31h(ip1,
     $ip2,ip3,itdkey)
                end do
              end do
            end do
            do ip3 = 1, nr
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  gt(ip1,ip2,ip3,bi,bj) = comlev1_bibj_gt_32h(ip1,ip2,
     $ip3,itdkey)
                end do
              end do
            end do
            call adimpldiff( bi,bj,imin,imax,jmin,jmax,gad_temperature,
     $kappark,adkappark,recip_hfacc,gt,adgt )
          endif
          if (tempstepping .and. implicitdiffusion) then
            call adcalc_3d_diffusivity( bi,bj,imin,imax,jmin,jmax,
     $gad_temperature,usegmredi,usekpp,adkappark )
          endif
          do k = 1, nr
            kkey = (itdkey-1)*nr+k
            kup = 1+mod(k+1,2)
            kdown = 1+mod(k,2)
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                rtranskp1(ip1,ip2) = comlev1_bibj_k_rtranskp1_62h(ip1,
     $ip2,kkey)
              end do
            end do
            call calc_common_factors( uvel,vvel,ufld,vfld,utrans,vtrans,
     $xa,ya,k,bi,bj,mythid )
            if (k .eq. 1) then
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  maskup(i,j) = 0.d0
                end do
              end do
            else
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  maskup(i,j) = maskc(i,j,k-1,bi,bj)*maskc(i,j,k,bi,bj)
                end do
              end do
            endif
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                rtrans(ip1,ip2) = comlev1_bibj_k_rtrans_63h(ip1,ip2,
     $kkey)
              end do
            end do
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                wfld(ip1,ip2) = comlev1_bibj_k_wfld_64h(ip1,ip2,kkey)
              end do
            end do
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                kappart(ip1,ip2) = comlev1_bibj_k_kappart_65h(ip1,ip2,
     $kkey)
              end do
            end do
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                kappars(ip1,ip2) = comlev1_bibj_k_kappars_66h(ip1,ip2,
     $kkey)
              end do
            end do
            imin = 1-olx+2
            imax = snx+olx-1
            jmin = 1-oly+2
            jmax = sny+oly-1
            if (useoldfreezing .and. ( .not. useseaice) .and. ( .not. (
     $usethsice .and. k .eq. 1))) then
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  gt(ip1,ip2,k,bi,bj) = comlev1_bibj_k_gt_69h(ip1,ip2,
     $kkey)
                end do
              end do
              call adfreeze( bi,bj,imin,imax,jmin,jmax,k )
            endif
            if (saltstepping) then
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  gsnm1(ip1,ip2,k,bi,bj) = comlev1_bibj_k_gsnm1_68h(ip1,
     $ip2,kkey)
                end do
              end do
              call adtimestep_tracer( bi,bj,imin,imax,jmin,jmax,k,
     $dttracerlev(k),adsalt,adgs )
              call adcalc_gs( bi,bj,imin,imax,jmin,jmax,k,kup,kdown,xa,
     $ya,maskup,ufld,adufld,vfld,advfld,wfld,adwfld,utrans,adutrans,
     $vtrans,advtrans,rtrans,adrtrans,rtranskp1,adrtranskp1,kappars,
     $adkappars,adfvers,myiter,mythid )
            endif
            if (tempstepping) then
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  gtnm1(ip1,ip2,k,bi,bj) = comlev1_bibj_k_gtnm1_67h(ip1,
     $ip2,kkey)
                end do
              end do
              call adtimestep_tracer( bi,bj,imin,imax,jmin,jmax,k,
     $dttracerlev(k),adtheta,adgt )
              call adcalc_gt( bi,bj,imin,imax,jmin,jmax,k,kup,kdown,xa,
     $ya,maskup,ufld,adufld,vfld,advfld,wfld,adwfld,utrans,adutrans,
     $vtrans,advtrans,rtrans,adrtrans,rtranskp1,adrtranskp1,kappart,
     $adkappart,adfvert,myiter,mythid )
            endif
            imin = 1-olx
            imax = snx+olx
            jmin = 1-oly
            jmax = sny+oly
            if ( .not. implicitdiffusion) then
              call adcalc_diffusivity( bi,bj,imin,imax,jmin,jmax,k,
     $maskup,adkappart,adkappars )
            endif
            if (k .eq. 1) then
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  adrtrans(i,j) = 0.d0
                  adwfld(i,j) = 0.d0
                end do
              end do
            else
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  maskup(i,j) = maskc(i,j,k-1,bi,bj)*maskc(i,j,k,bi,bj)
                  adwfld(i,j) = adwfld(i,j)+adrtrans(i,j)*ra(i,j,bi,bj)*
     $maskup(i,j)*deepfac2f(k)*rhofacf(k)
                  adrtrans(i,j) = 0.d0
                  adwvel(i,j,k,bi,bj) = adwvel(i,j,k,bi,bj)+adwfld(i,j)
                  adwfld(i,j) = 0.d0
                end do
              end do
            endif
            call adcalc_common_factors( aduvel,advvel,adufld,advfld,
     $adutrans,advtrans,k,bi,bj )
            if (k .eq. nr) then
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  adrtranskp1(i,j) = 0.d0
                end do
              end do
            else
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  adrtrans(i,j) = adrtrans(i,j)+adrtranskp1(i,j)
                  adrtranskp1(i,j) = 0.d0
                end do
              end do
            endif
          end do
          if (saltmultidimadvec) then
            call adgad_advection( saltimplvertadv,saltadvscheme,
     $saltvertadvscheme,gad_salinity,dttracerlev,uvel,aduvel,vvel,
     $advvel,wvel,adwvel,salt,adsalt,adgs,bi,bj,mythid )
          endif
          if (tempmultidimadvec) then
            call adgad_advection( tempimplvertadv,tempadvscheme,
     $tempvertadvscheme,gad_temperature,dttracerlev,uvel,aduvel,vvel,
     $advvel,wvel,adwvel,theta,adtheta,adgt,bi,bj,mythid )
          endif
          do k = 1, nr
            do j = 1-oly, sny+oly
              do i = 1-olx, snx+olx
                adgs(i,j,k,bi,bj) = 0.d0
                adgt(i,j,k,bi,bj) = 0.d0
                adkappark(i,j,k) = 0.d0
              end do
            end do
          end do
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              adkappars(i,j) = 0.d0
              adkappart(i,j) = 0.d0
              adfvers(i,j,2) = 0.d0
              adfvers(i,j,1) = 0.d0
              adfvert(i,j,2) = 0.d0
              adfvert(i,j,1) = 0.d0
              adrtranskp1(i,j) = 0.d0
              adrtrans(i,j) = 0.d0
            end do
          end do
        end do
      end do
      if (linfsconservetr) then
        do ip5 = 1, nsy
          do ip4 = 1, nsx
            do ip3 = 1, nr
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  theta(ip1,ip2,ip3,ip4,ip5) = comlev1_theta_46h(ip1,
     $ip2,ip3,ip4,ip5,ikey_dynamics)
                end do
              end do
            end do
          end do
        end do
        do ip5 = 1, nsy
          do ip4 = 1, nsx
            do ip3 = 1, nr
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  salt(ip1,ip2,ip3,ip4,ip5) = comlev1_salt_47h(ip1,ip2,
     $ip3,ip4,ip5,ikey_dynamics)
                end do
              end do
            end do
          end do
        end do
        do ip5 = 1, nsy
          do ip4 = 1, nsx
            do ip3 = 1, nr
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  wvel(ip1,ip2,ip3,ip4,ip5) = comlev1_wvel_48h(ip1,ip2,
     $ip3,ip4,ip5,ikey_dynamics)
                end do
              end do
            end do
          end do
        end do
        call adcalc_wsurf_tr( theta,adtheta,salt,adsalt,wvel,adwvel,
     $mythid )
      endif
      adssurfcor = 0.d0
      adtsurfcor = 0.d0

      end

      subroutine mdthermodynamics( mytime, myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer gad_salinity
      parameter ( gad_salinity = 2 )
      integer gad_temperature
      parameter ( gad_temperature = 1 )
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      real*8 comlev1_bibj_gs_34h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadgs/ comlev1_bibj_gs_34h

      real*8 comlev1_bibj_k_gsnm1_68h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadgsnm1/ comlev1_bibj_k_gsnm1_68h

      real*8 comlev1_bibj_gt_32h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadgt/ comlev1_bibj_gt_32h

      real*8 comlev1_bibj_k_gtnm1_67h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadgtnm1/ comlev1_bibj_k_gtnm1_67h

      real*8 comlev1_bibj_k_gt_69h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadgu/ comlev1_bibj_k_gt_69h

      real*8 comlev1_bibj_kappark_33h(1-olx:snx+olx,1-oly:sny+oly,nr,
     $120)
      common /cadkappark/ comlev1_bibj_kappark_33h

      real*8 comlev1_bibj_kappark_31h(1-olx:snx+olx,1-oly:sny+oly,nr,
     $120)
      common /cadkapparl/ comlev1_bibj_kappark_31h

      real*8 comlev1_bibj_k_kappars_66h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadkappars/ comlev1_bibj_k_kappars_66h

      real*8 comlev1_bibj_k_kappart_65h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadkappart/ comlev1_bibj_k_kappart_65h

      real*8 comlev1_bibj_k_rtrans_63h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadrtrans/ comlev1_bibj_k_rtrans_63h

      real*8 comlev1_bibj_k_rtranskp1_62h(1-olx:snx+olx,1-oly:sny+oly,
     $1800)
      common /cadrtranskp1/ comlev1_bibj_k_rtranskp1_62h

      real*8 comlev1_bibj_salt_28h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadsalw/ comlev1_bibj_salt_28h

      real*8 comlev1_salt_47h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /cadsalx/ comlev1_salt_47h

      real*8 comlev1_bibj_theta_27h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadthete/ comlev1_bibj_theta_27h

      real*8 comlev1_theta_46h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,
     $30)
      common /cadthetf/ comlev1_theta_46h

      real*8 comlev1_bibj_uvel_29h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /caduvem/ comlev1_bibj_uvel_29h

      real*8 comlev1_bibj_vvel_30h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadvvem/ comlev1_bibj_vvel_30h

      real*8 comlev1_bibj_k_wfld_64h(1-olx:snx+olx,1-oly:sny+oly,1800)
      common /cadwfld/ comlev1_bibj_k_wfld_64h

      real*8 comlev1_bibj_wvel_26h(1-olx:snx+olx,1-oly:sny+oly,nr,120)
      common /cadwvel/ comlev1_bibj_wvel_26h

      real*8 comlev1_wvel_48h(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy,30)
      common /cadwvem/ comlev1_wvel_48h

      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      logical adamsbashforth_s
      logical adamsbashforth_t
      logical adamsbashforthgs
      logical adamsbashforthgt
      logical saltmultidimadvec
      logical saltsom_advection
      logical tempmultidimadvec
      logical tempsom_advection
      common /gad_parm_l/ tempsom_advection, saltsom_advection, 
     $tempmultidimadvec, saltmultidimadvec, adamsbashforthgt, 
     $adamsbashforthgs, adamsbashforth_t, adamsbashforth_s

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      double precision ssurfcor
      double precision tsurfcor
      common /surf_correc/ tsurfcor, ssurfcor

      integer ikey_daily_1
      integer ikey_daily_2
      integer ikey_dynamics
      integer ikey_yearly
      integer iloop_daily
      common /tamc_keys_i/ ikey_dynamics, ikey_yearly, ikey_daily_1, 
     $ikey_daily_2, iloop_daily

C==============================================
C declare arguments
C==============================================
      integer myiter
      integer mythid
      double precision mytime

C==============================================
C declare local variables
C==============================================
      integer act1
      integer act2
      integer act3
      integer act4
      integer bi
      integer bj
      double precision fvers(1-olx:snx+olx,1-oly:sny+oly,2)
      double precision fvert(1-olx:snx+olx,1-oly:sny+oly,2)
      integer i
      integer imax
      integer imin
      integer itdkey
      integer iu7
      integer iu8
      integer iu9
      integer iv0
      integer iv1
      integer iv2
      integer iv3
      integer iv4
      integer iv5
      integer iv6
      integer iv7
      integer iv8
      integer iv9
      integer iva
      integer ivb
      integer ivc
      integer ivd
      integer ive
      integer ivf
      integer ivg
      integer ivh
      integer ivi
      integer ivz
      integer iwa
      integer iwb
      integer iwc
      integer iwd
      integer iwe
      integer iwf
      integer iwg
      integer iwh
      integer iwi
      integer iwj
      integer iwk
      integer iwl
      integer iwm
      integer iwn
      integer iwo
      integer iwp
      integer iwq
      integer iwr
      integer iws
      integer iwt
      integer iwu
      integer iwv
      integer iww
      integer iwx
      integer iwy
      integer j
      integer jmax
      integer jmin
      integer k
      double precision kappark(1-olx:snx+olx,1-oly:sny+oly,nr)
      double precision kappars(1-olx:snx+olx,1-oly:sny+oly)
      double precision kappart(1-olx:snx+olx,1-oly:sny+oly)
      integer kdown
      integer kkey
      integer km1
      integer kup
      double precision maskup(1-olx:snx+olx,1-oly:sny+oly)
      integer max1
      integer max2
      integer max3
      double precision rtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision rtranskp1(1-olx:snx+olx,1-oly:sny+oly)
      double precision ufld(1-olx:snx+olx,1-oly:sny+oly)
      double precision utrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision vfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision vtrans(1-olx:snx+olx,1-oly:sny+oly)
      double precision wfld(1-olx:snx+olx,1-oly:sny+oly)
      double precision xa(1-olx:snx+olx,1-oly:sny+oly)
      double precision ya(1-olx:snx+olx,1-oly:sny+oly)

C**********************************************
C executable statements of routine
C**********************************************
      tsurfcor = 0.d0
      ssurfcor = 0.d0
      if (linfsconservetr) then
        do iwy = 1, nsy
          do iwx = 1, nsx
            do iww = 1, nr
              do iwv = 1-oly, sny+oly
                do iwu = 1-olx, snx+olx
                  comlev1_theta_46h(iwu,iwv,iww,iwx,iwy,ikey_dynamics) =
     $ theta(iwu,iwv,iww,iwx,iwy)
                end do
              end do
            end do
          end do
        end do
        do iwy = 1, nsy
          do iwx = 1, nsx
            do iww = 1, nr
              do iwv = 1-oly, sny+oly
                do iwu = 1-olx, snx+olx
                  comlev1_salt_47h(iwu,iwv,iww,iwx,iwy,ikey_dynamics) = 
     $salt(iwu,iwv,iww,iwx,iwy)
                end do
              end do
            end do
          end do
        end do
        do iwy = 1, nsy
          do iwx = 1, nsx
            do iww = 1, nr
              do iwv = 1-oly, sny+oly
                do iwu = 1-olx, snx+olx
                  comlev1_wvel_48h(iwu,iwv,iww,iwx,iwy,ikey_dynamics) = 
     $wvel(iwu,iwv,iww,iwx,iwy)
                end do
              end do
            end do
          end do
        end do
        call calc_wsurf_tr( theta,salt,wvel,mytime,myiter,mythid )
      endif
      do bj = mybylo(mythid), mybyhi(mythid)
        do bi = mybxlo(mythid), mybxhi(mythid)
          act1 = bi-mybxlo(mythid)
          max1 = mybxhi(mythid)-mybxlo(mythid)+1
          act2 = bj-mybylo(mythid)
          max2 = mybyhi(mythid)-mybylo(mythid)+1
          act3 = mythid-1
          max3 = ntx*nty
          act4 = ikey_dynamics-1
          itdkey = act1+1+act2*max1+act3*max1*max2+act4*max1*max2*max3
          do j = 1-oly, sny+oly
            do i = 1-olx, snx+olx
              rtrans(i,j) = 0.d0
              rtranskp1(i,j) = 0.d0
              fvert(i,j,1) = 0.d0
              fvert(i,j,2) = 0.d0
              fvers(i,j,1) = 0.d0
              fvers(i,j,2) = 0.d0
              kappart(i,j) = 0.d0
              kappars(i,j) = 0.d0
            end do
          end do
          do k = 1, nr
            do j = 1-oly, sny+oly
              do i = 1-olx, snx+olx
                kappark(i,j,k) = 0.d0
                gt(i,j,k,bi,bj) = 0.d0
                gs(i,j,k,bi,bj) = 0.d0
              end do
            end do
          end do
          do iwt = 1, nr
            do iws = 1-oly, sny+oly
              do iwr = 1-olx, snx+olx
                comlev1_bibj_wvel_26h(iwr,iws,iwt,itdkey) = wvel(iwr,
     $iws,iwt,bi,bj)
              end do
            end do
          end do
          do iwq = 1, nr
            do iwp = 1-oly, sny+oly
              do iwo = 1-olx, snx+olx
                comlev1_bibj_theta_27h(iwo,iwp,iwq,itdkey) = theta(iwo,
     $iwp,iwq,bi,bj)
              end do
            end do
          end do
          do iwn = 1, nr
            do iwm = 1-oly, sny+oly
              do iwl = 1-olx, snx+olx
                comlev1_bibj_salt_28h(iwl,iwm,iwn,itdkey) = salt(iwl,
     $iwm,iwn,bi,bj)
              end do
            end do
          end do
          do iwk = 1, nr
            do iwj = 1-oly, sny+oly
              do iwi = 1-olx, snx+olx
                comlev1_bibj_uvel_29h(iwi,iwj,iwk,itdkey) = uvel(iwi,
     $iwj,iwk,bi,bj)
              end do
            end do
          end do
          do iwh = 1, nr
            do iwg = 1-oly, sny+oly
              do iwf = 1-olx, snx+olx
                comlev1_bibj_vvel_30h(iwf,iwg,iwh,itdkey) = vvel(iwf,
     $iwg,iwh,bi,bj)
              end do
            end do
          end do
          if (tempmultidimadvec) then
            call mdgad_advection( tempimplvertadv,tempadvscheme,
     $tempvertadvscheme,gad_temperature,dttracerlev,uvel,vvel,wvel,
     $theta,gt,bi,bj,mytime,myiter,mythid )
          endif
          if (saltmultidimadvec) then
            call mdgad_advection( saltimplvertadv,saltadvscheme,
     $saltvertadvscheme,gad_salinity,dttracerlev,uvel,vvel,wvel,salt,gs,
     $bi,bj,mytime,myiter,mythid )
          endif
          do k = nr, 1, -1
            kkey = (itdkey-1)*nr+k
            kup = 1+mod(k+1,2)
            kdown = 1+mod(k,2)
            imin = 1-olx
            imax = snx+olx
            jmin = 1-oly
            jmax = sny+oly
            if (k .eq. nr) then
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  rtranskp1(i,j) = 0.d0
                end do
              end do
            else
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  rtranskp1(i,j) = rtrans(i,j)
                end do
              end do
            endif
            do iwe = 1-oly, sny+oly
              do iwd = 1-olx, snx+olx
                comlev1_bibj_k_rtranskp1_62h(iwd,iwe,kkey) = rtranskp1(
     $iwd,iwe)
              end do
            end do
            call calc_common_factors( uvel,vvel,ufld,vfld,utrans,vtrans,
     $xa,ya,k,bi,bj,mythid )
            if (k .eq. 1) then
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  wfld(i,j) = 0.d0
                  maskup(i,j) = 0.d0
                  rtrans(i,j) = 0.d0
                end do
              end do
            else
              do j = 1-oly, sny+oly
                do i = 1-olx, snx+olx
                  wfld(i,j) = wvel(i,j,k,bi,bj)
                  maskup(i,j) = maskc(i,j,k-1,bi,bj)*maskc(i,j,k,bi,bj)
                  rtrans(i,j) = wfld(i,j)*ra(i,j,bi,bj)*maskup(i,j)*
     $deepfac2f(k)*rhofacf(k)
                end do
              end do
            endif
            do iwc = 1-oly, sny+oly
              do iwb = 1-olx, snx+olx
                comlev1_bibj_k_rtrans_63h(iwb,iwc,kkey) = rtrans(iwb,
     $iwc)
              end do
            end do
            do iwa = 1-oly, sny+oly
              do iv9 = 1-olx, snx+olx
                comlev1_bibj_k_wfld_64h(iv9,iwa,kkey) = wfld(iv9,iwa)
              end do
            end do
            if ( .not. implicitdiffusion) then
              call calc_diffusivity( bi,bj,imin,imax,jmin,jmax,k,maskup,
     $kappart,kappars,mythid )
            endif
            do iv8 = 1-oly, sny+oly
              do iv7 = 1-olx, snx+olx
                comlev1_bibj_k_kappart_65h(iv7,iv8,kkey) = kappart(iv7,
     $iv8)
              end do
            end do
            do iv6 = 1-oly, sny+oly
              do iv5 = 1-olx, snx+olx
                comlev1_bibj_k_kappars_66h(iv5,iv6,kkey) = kappars(iv5,
     $iv6)
              end do
            end do
            imin = 1-olx+2
            imax = snx+olx-1
            jmin = 1-oly+2
            jmax = sny+oly-1
            if (tempstepping) then
              do iv4 = 1-oly, sny+oly
                do iv3 = 1-olx, snx+olx
                  comlev1_bibj_k_gtnm1_67h(iv3,iv4,kkey) = gtnm1(iv3,
     $iv4,k,bi,bj)
                end do
              end do
              call mdcalc_gt( bi,bj,imin,imax,jmin,jmax,k,km1,kup,kdown,
     $xa,ya,maskup,ufld,vfld,wfld,utrans,vtrans,rtrans,rtranskp1,
     $kappart,fvert,mytime,myiter,mythid )
              call timestep_tracer( bi,bj,imin,imax,jmin,jmax,k,
     $tempadvscheme,dttracerlev(k),theta,gt,myiter,mythid )
            endif
            if (saltstepping) then
              do iv2 = 1-oly, sny+oly
                do iv1 = 1-olx, snx+olx
                  comlev1_bibj_k_gsnm1_68h(iv1,iv2,kkey) = gsnm1(iv1,
     $iv2,k,bi,bj)
                end do
              end do
              call mdcalc_gs( bi,bj,imin,imax,jmin,jmax,k,km1,kup,kdown,
     $xa,ya,maskup,ufld,vfld,wfld,utrans,vtrans,rtrans,rtranskp1,
     $kappars,fvers,mytime,myiter,mythid )
              call timestep_tracer( bi,bj,imin,imax,jmin,jmax,k,
     $saltadvscheme,dttracerlev(k),salt,gs,myiter,mythid )
            endif
            if (useoldfreezing .and. ( .not. useseaice) .and. ( .not. (
     $usethsice .and. k .eq. 1))) then
              do iv0 = 1-oly, sny+oly
                do ivz = 1-olx, snx+olx
                  comlev1_bibj_k_gt_69h(ivz,iv0,kkey) = gt(ivz,iv0,k,bi,
     $bj)
                end do
              end do
              call freeze( bi,bj,imin,imax,jmin,jmax,k,mythid )
            endif
          end do
          imin = 1
          imax = snx
          jmin = 1
          jmax = sny
          if (tempstepping .and. implicitdiffusion) then
            call calc_3d_diffusivity( bi,bj,imin,imax,jmin,jmax,
     $gad_temperature,usegmredi,usekpp,kappark,mythid )
          endif
          if (tempstepping .and. implicitdiffusion) then
            do ivi = 1, nr
              do ivh = 1-oly, sny+oly
                do ivg = 1-olx, snx+olx
                  comlev1_bibj_kappark_31h(ivg,ivh,ivi,itdkey) = 
     $kappark(ivg,ivh,ivi)
                end do
              end do
            end do
            do ivf = 1, nr
              do ive = 1-oly, sny+oly
                do ivd = 1-olx, snx+olx
                  comlev1_bibj_gt_32h(ivd,ive,ivf,itdkey) = gt(ivd,ive,
     $ivf,bi,bj)
                end do
              end do
            end do
            call impldiff( bi,bj,imin,imax,jmin,jmax,gad_temperature,
     $kappark,recip_hfacc,gt,mythid )
          endif
          if (saltstepping .and. implicitdiffusion) then
            call calc_3d_diffusivity( bi,bj,imin,imax,jmin,jmax,
     $gad_salinity,usegmredi,usekpp,kappark,mythid )
          endif
          if (saltstepping .and. implicitdiffusion) then
            do ivc = 1, nr
              do ivb = 1-oly, sny+oly
                do iva = 1-olx, snx+olx
                  comlev1_bibj_kappark_33h(iva,ivb,ivc,itdkey) = 
     $kappark(iva,ivb,ivc)
                end do
              end do
            end do
            do iu9 = 1, nr
              do iu8 = 1-oly, sny+oly
                do iu7 = 1-olx, snx+olx
                  comlev1_bibj_gs_34h(iu7,iu8,iu9,itdkey) = gs(iu7,iu8,
     $iu9,bi,bj)
                end do
              end do
            end do
            call impldiff( bi,bj,imin,imax,jmin,jmax,gad_salinity,
     $kappark,recip_hfacc,gs,mythid )
          endif
        end do
      end do
      end

      subroutine adtimestep( bi, bj, imin, imax, jmin, jmax, k, 
     $addphihydx, addphihydy, adphisurfx, adphisurfy, adgudissip, 
     $adgvdissip, myiter )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision cosfacu(1-oly:sny+oly,nsx,nsy)
      double precision cosfacv(1-oly:sny+oly,nsx,nsy)
      double precision deepfac2c(nr)
      double precision deepfac2f(nr+1)
      double precision deepfacc(nr)
      double precision deepfacf(nr+1)
      double precision globalarea
      double precision gravitysign
      double precision recip_deepfac2c(nr)
      double precision recip_deepfac2f(nr+1)
      double precision recip_deepfacc(nr)
      double precision recip_deepfacf(nr+1)
      double precision rksign
      double precision sqcosfacu(1-oly:sny+oly,nsx,nsy)
      double precision sqcosfacv(1-oly:sny+oly,nsx,nsy)
      common /grid_rl/ cosfacu, cosfacv, sqcosfacu, sqcosfacv, deepfacc,
     $ deepfac2c, recip_deepfacc, recip_deepfac2c, deepfacf, deepfac2f, 
     $recip_deepfacf, recip_deepfac2f, gravitysign, rksign, globalarea

      double precision ahybsigmc(nr)
      double precision ahybsigmf(nr+1)
      double precision anglecosc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision anglesinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision bhybsigmc(nr)
      double precision bhybsigmf(nr+1)
      double precision dahybsigc(nr+1)
      double precision dahybsigf(nr)
      double precision dbhybsigc(nr+1)
      double precision dbhybsigf(nr)
      double precision drc(nr)
      double precision drf(nr)
      double precision dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcori(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcoricos(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision fcorig(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskinc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskins(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision maskinw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision masks(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision maskw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision r_low(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rc(nr)
      double precision recip_drc(nr)
      double precision recip_drf(nr)
      double precision recip_dxc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dxv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_dyu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_hfacc(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_hfacw(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision recip_ra(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_ras(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_raz(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision recip_rcol(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rf(nr+1)
      double precision rlows(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rloww(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision ro_surf(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfs(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision rsurfw(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatu(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision tanphiatv(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision xg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision yg(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /grid_rs/ dxc, dxf, dxg, dxv, dyc, dyf, dyg, dyu, r_low, 
     $rloww, rlows, ro_surf, rsurfw, rsurfs, hfacc, hfacw, hfacs, 
     $recip_dxc, recip_dxf, recip_dxg, recip_dxv, recip_dyc, recip_dyf, 
     $recip_dyg, recip_dyu, recip_rcol, recip_hfacc, recip_hfacw, 
     $recip_hfacs, xc, yc, ra, raw, ras, raz, xg, yg, maskinc, maskinw, 
     $maskins, maskc, maskw, masks, recip_ra, recip_raw, recip_ras, 
     $recip_raz, drc, drf, recip_drc, recip_drf, rc, rf, ahybsigmf, 
     $bhybsigmf, ahybsigmc, bhybsigmc, dahybsigf, dbhybsigf, dbhybsigc, 
     $dahybsigc, tanphiatu, tanphiatv, anglecosc, anglesinc, fcori, 
     $fcorig, fcoricos

      integer cg2dchkresfreq
      integer cg2dmaxiters
      integer cg2dprecondfreq
      integer cg3dchkresfreq
      integer cg3dmaxiters
      integer debuglevel
      integer momforcingoutab
      integer monitorselect
      integer nenditer
      integer niter0
      integer nonlinfreesurf
      integer ntimesteps
      integer readbinaryprec
      integer saltadvscheme
      integer saltvertadvscheme
      integer select_rstar
      integer selectaddfluid
      integer selectkescheme
      integer selectnhfreesurf
      integer selectsigmacoord
      integer selectvortscheme
      integer tempadvscheme
      integer tempvertadvscheme
      integer tracforcingoutab
      integer writebinaryprec
      integer writestateprec
      common /parm_i/ cg2dmaxiters, cg2dchkresfreq, cg2dprecondfreq, 
     $cg3dmaxiters, cg3dchkresfreq, niter0, ntimesteps, nenditer, 
     $writestateprec, writebinaryprec, readbinaryprec, nonlinfreesurf, 
     $select_rstar, selectnhfreesurf, selectsigmacoord, selectaddfluid, 
     $momforcingoutab, tracforcingoutab, tempadvscheme, 
     $tempvertadvscheme, saltadvscheme, saltvertadvscheme, 
     $selectkescheme, selectvortscheme, monitorselect, debuglevel

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

      integer dphinhstatus
      integer mom_startab
      integer nchecklev
      integer nhydstartab
      integer saltstartab
      integer tempstartab
      common /restart_i/ nchecklev, tempstartab, saltstartab, 
     $mom_startab, nhydstartab, dphinhstatus

C==============================================
C declare arguments
C==============================================
      double precision addphihydx(1-olx:snx+olx,1-oly:sny+oly)
      double precision addphihydy(1-olx:snx+olx,1-oly:sny+oly)
      double precision adgudissip(1-olx:snx+olx,1-oly:sny+oly)
      double precision adgvdissip(1-olx:snx+olx,1-oly:sny+oly)
      double precision adphisurfx(1-olx:snx+olx,1-oly:sny+oly)
      double precision adphisurfy(1-olx:snx+olx,1-oly:sny+oly)
      integer bi
      integer bj
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k
      integer myiter

C==============================================
C declare local variables
C==============================================
      double precision adgucor(1-olx:snx+olx,1-oly:sny+oly)
      double precision adgutmp(1-olx:snx+olx,1-oly:sny+oly)
      double precision adgvcor(1-olx:snx+olx,1-oly:sny+oly)
      double precision adgvtmp(1-olx:snx+olx,1-oly:sny+oly)
      integer i
      integer ip1
      integer ip2
      integer j
      double precision phxfac
      double precision phyfac
      double precision psfac

C----------------------------------------------
C RESET LOCAL ADJOINT VARIABLES
C----------------------------------------------
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adgucor(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adgutmp(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adgvcor(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1-oly, sny+oly
        do ip1 = 1-olx, snx+olx
          adgvtmp(ip1,ip2) = 0.d0
        end do
      end do

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      psfac = pffacmom*(1.d0-implicsurfpress)*recip_deepfacc(k)*
     $recip_rhofacc(k)
      phxfac = pffacmom
      phyfac = pffacmom
      if (( .not. staggertimestep) .and. ( .not. implicitintgravwave)) 
     $then
        phxfac = 0.
        phyfac = 0.
      endif
      do j = jmin, jmax
        do i = imin, imax
          addphihydy(i,j) = addphihydy(i,j)-adgv(i,j,k,bi,bj)*deltatmom*
     $phyfac*masks(i,j,k,bi,bj)
          adgvtmp(i,j) = adgvtmp(i,j)+adgv(i,j,k,bi,bj)*deltatmom*masks(
     $i,j,k,bi,bj)
          adphisurfy(i,j) = adphisurfy(i,j)-adgv(i,j,k,bi,bj)*deltatmom*
     $psfac*masks(i,j,k,bi,bj)
          advvel(i,j,k,bi,bj) = advvel(i,j,k,bi,bj)+adgv(i,j,k,bi,bj)
          adgv(i,j,k,bi,bj) = 0.d0
        end do
      end do
      do j = jmin, jmax
        do i = imin, imax
          addphihydx(i,j) = addphihydx(i,j)-adgu(i,j,k,bi,bj)*deltatmom*
     $phxfac*maskw(i,j,k,bi,bj)
          adgutmp(i,j) = adgutmp(i,j)+adgu(i,j,k,bi,bj)*deltatmom*maskw(
     $i,j,k,bi,bj)
          adphisurfx(i,j) = adphisurfx(i,j)-adgu(i,j,k,bi,bj)*deltatmom*
     $psfac*maskw(i,j,k,bi,bj)
          aduvel(i,j,k,bi,bj) = aduvel(i,j,k,bi,bj)+adgu(i,j,k,bi,bj)
          adgu(i,j,k,bi,bj) = 0.d0
        end do
      end do
      if (momviscosity .and. ( .not. momdissip_in_ab)) then
        do j = jmin, jmax
          do i = imin, imax
            adgvdissip(i,j) = adgvdissip(i,j)+adgvtmp(i,j)
            adgudissip(i,j) = adgudissip(i,j)+adgutmp(i,j)
          end do
        end do
      endif
      if (usecdscheme) then
        do j = jmin, jmax
          do i = imin, imax
            adgv(i,j,k,bi,bj) = adgv(i,j,k,bi,bj)+adgvtmp(i,j)
            adgvcor(i,j) = adgvcor(i,j)+adgvtmp(i,j)
            adgvtmp(i,j) = 0.d0
            adgu(i,j,k,bi,bj) = adgu(i,j,k,bi,bj)+adgutmp(i,j)
            adgucor(i,j) = adgucor(i,j)+adgutmp(i,j)
            adgutmp(i,j) = 0.d0
          end do
        end do
        call adcd_code_scheme( bi,bj,k,addphihydx,addphihydy,adgutmp,
     $adgvtmp,adgucor,adgvcor )
        if (momviscosity .and. ( .not. momdissip_in_ab)) then
          do j = jmin, jmax
            do i = imin, imax
              adgvdissip(i,j) = adgvdissip(i,j)+adgvtmp(i,j)
              adgudissip(i,j) = adgudissip(i,j)+adgutmp(i,j)
            end do
          end do
        endif
        do j = jmin, jmax
          do i = imin, imax
            adgv(i,j,k,bi,bj) = adgv(i,j,k,bi,bj)+adgvtmp(i,j)
            adgvtmp(i,j) = 0.d0
            adgu(i,j,k,bi,bj) = adgu(i,j,k,bi,bj)+adgutmp(i,j)
            adgutmp(i,j) = 0.d0
          end do
        end do
      else
        do j = jmin, jmax
          do i = imin, imax
            adgv(i,j,k,bi,bj) = adgv(i,j,k,bi,bj)+adgvtmp(i,j)
            adgvtmp(i,j) = 0.d0
            adgu(i,j,k,bi,bj) = adgu(i,j,k,bi,bj)+adgutmp(i,j)
            adgutmp(i,j) = 0.d0
          end do
        end do
      endif
      if (momforcing .and. momforcingoutab .eq. 1) then
        call adexternal_forcing_v( bi,bj,k )
        call adexternal_forcing_u( bi,bj,k )
      endif
      call adadams_bashforth2( bi,bj,k,adgv,adgvnm1,mom_startab,myiter )
      call adadams_bashforth2( bi,bj,k,adgu,adgunm1,mom_startab,myiter )
      if (momforcing .and. momforcingoutab .ne. 1) then
        call adexternal_forcing_v( bi,bj,k )
        call adexternal_forcing_u( bi,bj,k )
      endif
      if (momviscosity .and. momdissip_in_ab) then
        do j = jmin, jmax
          do i = imin, imax
            adgvdissip(i,j) = adgvdissip(i,j)+adgv(i,j,k,bi,bj)
            adgudissip(i,j) = adgudissip(i,j)+adgu(i,j,k,bi,bj)
          end do
        end do
      endif
      phxfac = pffacmom
      phyfac = pffacmom
      if (( .not. staggertimestep) .and. ( .not. implicitintgravwave)) 
     $then
        do j = jmin, jmax
          do i = imin, imax
            addphihydy(i,j) = addphihydy(i,j)-adgv(i,j,k,bi,bj)*phyfac
            addphihydx(i,j) = addphihydx(i,j)-adgu(i,j,k,bi,bj)*phxfac
          end do
        end do
      endif

      end

      subroutine adtimestep_tracer( bi, bj, imin, imax, jmin, jmax, k, 
     $deltatloc, adtracer, adgtracer )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
C==============================================
C declare arguments
C==============================================
      double precision adgtracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtracer(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      integer bi
      integer bj
      double precision deltatloc
      integer imax
      integer imin
      integer jmax
      integer jmin
      integer k

C==============================================
C declare local variables
C==============================================
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do j = jmin, jmax
        do i = imin, imax
          adtracer(i,j,k,bi,bj) = adtracer(i,j,k,bi,bj)+adgtracer(i,j,k,
     $bi,bj)
          adgtracer(i,j,k,bi,bj) = adgtracer(i,j,k,bi,bj)*deltatloc
        end do
      end do

      end

      subroutine adtracers_correction_step( mytime, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      integer mythid
      double precision mytime

C==============================================
C declare local variables
C==============================================
      integer bi
      integer bj

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      do bj = mybyhi(mythid), mybylo(mythid), -1
        do bi = mybxhi(mythid), mybxlo(mythid), -1
          if (cadjfreq .ne. 0.) then
            call adconvective_adjustment( bi,bj,mytime,mythid )
          endif
        end do
      end do
      do bj = mybyhi(mythid), mybylo(mythid), -1
        do bi = mybxhi(mythid), mybxlo(mythid), -1
          if (saltstepping) then
            call adcycle_tracer( bi,bj,adsalt,adgs )
          endif
          if (tempstepping) then
            call adcycle_tracer( bi,bj,adtheta,adgt )
          endif
        end do
      end do

      end

      subroutine mdtracers_correction_step( mytime, myiter, mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision etan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision gs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision gvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision salt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision theta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision uvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision vvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision wvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /dynvars_r/ etan, uvel, vvel, wvel, theta, salt, gu, gv, 
     $gt, gs, gunm1, gvnm1, gtnm1, gsnm1

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      logical allowfreezing
      logical balanceempmr
      logical balanceprintmean
      logical balanceqnet
      logical checkinisalt
      logical checkinitemp
      logical debugmode
      logical deepatmosphere
      logical doab_ongtgs
      logical dosaltclimrelax
      logical dothetaclimrelax
      logical dumpinitandlast
      logical exactconserv
      logical fluidisair
      logical fluidiswater
      logical globalfiles
      logical highordervorticity
      logical implicitdiffusion
      logical implicitfreesurface
      logical implicitintgravwave
      logical implicitviscosity
      logical inadexact
      logical inadfalse
      logical inadmode
      logical inadtrue
      logical linfsconservetr
      logical maskinisalt
      logical maskinitemp
      logical metricterms
      logical momadvection
      logical momdissip_in_ab
      logical momforcing
      logical momimplvertadv
      logical mompressureforcing
      logical momstepping
      logical momviscosity
      logical monitor_stdio
      logical multidimadvection
      logical no_slip_bottom
      logical no_slip_sides
      logical nonhydrostatic
      logical outputtypesinclusive
      logical periodicexternalforcing
      logical pickup_read_mdsio
      logical pickup_write_immed
      logical pickup_write_mdsio
      logical pickupstrictlymatch
      logical quasihydrostatic
      logical rigidlid
      logical rotategrid
      logical saltadvection
      logical saltforcing
      logical saltimplvertadv
      logical saltisactivetr
      logical saltstepping
      logical setcenterdr
      logical setinterfdr
      logical snapshot_mdsio
      logical staggertimestep
      logical startfrompickupab2
      logical tempadvection
      logical tempforcing
      logical tempimplvertadv
      logical tempisactivetr
      logical tempstepping
      logical timeave_mdsio
      logical uniformlin_phisurf
      logical upwindshear
      logical upwindvorticity
      logical use3dcoriolis
      logical use3dsolver
      logical useabsvorticity
      logical useareavisclength
      logical usebetaplanef
      logical usecdscheme
      logical useconstantf
      logical usecoriolis
      logical usedynp_ineos_zc
      logical useenergyconservingcoriolis
      logical usefullleith
      logical usejamartmomadv
      logical usejamartwetpoints
      logical usemultidimadvec
      logical usenhmterms
      logical useoldfreezing
      logical usepickupbeforec54
      logical userealfreshwaterflux
      logical usespheref
      logical usesrcgsolver
      logical usestraintensionvisc
      logical usingcartesiangrid
      logical usingcurvilineargrid
      logical usingcylindricalgrid
      logical usingpcoords
      logical usingsphericalpolargrid
      logical usingzcoords
      logical vectorinvariantmomentum
      logical writepickupatend
      common /parm_l/ fluidisair, fluidiswater, usingpcoords, 
     $usingzcoords, usedynp_ineos_zc, usingcartesiangrid, 
     $usingsphericalpolargrid, rotategrid, usingcurvilineargrid, 
     $usingcylindricalgrid, deepatmosphere, setinterfdr, setcenterdr, 
     $no_slip_sides, no_slip_bottom, usefullleith, usestraintensionvisc,
     $ useareavisclength, momviscosity, momadvection, momforcing, 
     $mompressureforcing, metricterms, usenhmterms, usecoriolis, 
     $use3dcoriolis, useconstantf, usebetaplanef, usespheref, 
     $usecdscheme, vectorinvariantmomentum, useenergyconservingcoriolis,
     $ usejamartwetpoints, usejamartmomadv, upwindvorticity, 
     $highordervorticity, useabsvorticity, upwindshear, momstepping, 
     $tempstepping, saltstepping, tempadvection, tempisactivetr, 
     $tempforcing, saltadvection, saltisactivetr, saltforcing, 
     $maskinitemp, maskinisalt, checkinitemp, checkinisalt, 
     $userealfreshwaterflux, rigidlid, implicitfreesurface, 
     $exactconserv, linfsconservetr, uniformlin_phisurf, 
     $quasihydrostatic, nonhydrostatic, use3dsolver, 
     $implicitintgravwave, staggertimestep, implicitdiffusion, 
     $implicitviscosity, tempimplvertadv, saltimplvertadv, 
     $momimplvertadv, multidimadvection, usemultidimadvec, 
     $momdissip_in_ab, doab_ongtgs, balanceempmr, balanceqnet, 
     $balanceprintmean, dothetaclimrelax, dosaltclimrelax, 
     $allowfreezing, useoldfreezing, periodicexternalforcing, 
     $globalfiles, pickupstrictlymatch, usepickupbeforec54, 
     $startfrompickupab2, pickup_read_mdsio, pickup_write_mdsio, 
     $pickup_write_immed, writepickupatend, timeave_mdsio, 
     $snapshot_mdsio, monitor_stdio, outputtypesinclusive, 
     $dumpinitandlast, debugmode, inadmode, inadtrue, inadfalse, 
     $inadexact, usesrcgsolver

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      integer myiter
      integer mythid
      double precision mytime

C==============================================
C declare local variables
C==============================================
      integer bi
      integer bj

C**********************************************
C executable statements of routine
C**********************************************
      do bj = mybylo(mythid), mybyhi(mythid)
        do bi = mybxlo(mythid), mybxhi(mythid)
          if (tempstepping) then
            call cycle_tracer( bi,bj,theta,gt,mytime,myiter,mythid )
          endif
          if (saltstepping) then
            call cycle_tracer( bi,bj,salt,gs,mytime,myiter,mythid )
          endif
        end do
      end do
      do bj = mybylo(mythid), mybyhi(mythid)
        do bi = mybxlo(mythid), mybxhi(mythid)
          if (cadjfreq .ne. 0.) then
            call mdconvective_adjustment( bi,bj,mytime,myiter,mythid )
          endif
        end do
      end do
      end

      subroutine adupdate_etah( mythid )
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer max_no_threads
      parameter ( max_no_threads = 4 )
      integer npx
      parameter ( npx = 1 )
      integer npy
      parameter ( npy = 1 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer snx
      parameter ( snx = 45 )
      integer nx
      parameter ( nx = snx*nsx*npx )
      integer sny
      parameter ( sny = 20 )
      integer ny
      parameter ( ny = sny*nsy*npy )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )

C==============================================
C declare common blocks
C==============================================
      double precision adetan(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adgs(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgsnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgtnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgu(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgunm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgv(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adgvnm1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adsalt(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adtheta(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision aduvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision advvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      double precision adwvel(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
      common /addynvars_r/ adetan, aduvel, advvel, adwvel, adtheta, 
     $adsalt, adgu, adgv, adgt, adgs, adgunm1, adgvnm1, adgtnm1, adgsnm1

      double precision adetah(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /addynvars_r_2/ adetah

      double precision addetahdt(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adpmepr(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adexact_eta_local/ addetahdt, adpmepr

      integer eedataunit
      integer errormessageunit
      integer ioerrorcount(max_no_threads)
      integer maxlengthprt1d
      integer modeldataunit
      integer mybxhi(max_no_threads)
      integer mybxlo(max_no_threads)
      integer mybyhi(max_no_threads)
      integer mybylo(max_no_threads)
      integer myprocid
      integer mypx
      integer mypy
      integer myxgloballo
      integer myygloballo
      integer nthreads
      integer ntx
      integer nty
      integer numberofprocs
      integer pidio
      integer scrunit1
      integer scrunit2
      integer standardmessageunit
      common /eeparams_i/ errormessageunit, standardmessageunit, 
     $maxlengthprt1d, scrunit1, scrunit2, eedataunit, modeldataunit, 
     $numberofprocs, pidio, myprocid, mypx, mypy, myxgloballo, 
     $myygloballo, nthreads, mybxlo, mybxhi, mybylo, mybyhi, ntx, nty, 
     $ioerrorcount

      logical useaim
      logical useatm2d
      logical usebulkforce
      logical usecal
      logical usecheapaml
      logical usediagnostics
      logical usedown_slope
      logical useebm
      logical useecco
      logical useembed_files
      logical useexf
      logical usefizhi
      logical useflt
      logical usegad
      logical usegchem
      logical useggl90
      logical usegmredi
      logical usegrdchk
      logical usegridalt
      logical useicefront
      logical usekpp
      logical useland
      logical uselayers
      logical usematrix
      logical usemnc
      logical usemy82
      logical usemypackage
      logical useobcs
      logical useoffline
      logical useopps
      logical usepp81
      logical useptracers
      logical userbcs
      logical useregrid
      logical userunclock
      logical usesalt_plume
      logical usesbo
      logical useseaice
      logical useshap_filt
      logical useshelfice
      logical usesmooth
      logical usethsice
      logical usezonal_filt
      common /parm_packages/ usegad, useobcs, useshap_filt, 
     $usezonal_filt, useopps, usepp81, usemy82, useggl90, usekpp, 
     $usegmredi, usedown_slope, usecal, useexf, usebulkforce, useebm, 
     $usecheapaml, usegrdchk, usesmooth, useecco, usesbo, useflt, 
     $useptracers, usegchem, userbcs, useoffline, usematrix, useseaice, 
     $usesalt_plume, useshelfice, useicefront, usethsice, useatm2d, 
     $useaim, useland, usefizhi, usegridalt, usediagnostics, useregrid, 
     $uselayers, usemnc, userunclock, useembed_files, usemypackage

      double precision abeps
      double precision adjdumpfreq
      double precision adjmonitorfreq
      double precision affacmom
      double precision alph_ab
      double precision basetime
      double precision beta
      double precision beta_ab
      double precision bl79latvary
      double precision bottomdraglinear
      double precision bottomdragquadratic
      double precision cadjfreq
      double precision cffacmom
      double precision cg2dpcoffdfac
      double precision cg2dtargetresidual
      double precision cg2dtargetreswunit
      double precision cg3dtargetresidual
      double precision chkptfreq
      double precision convertfw2salt
      double precision cospower
      double precision dbdrref(nr)
      double precision delr(nr)
      double precision delrc(nr+1)
      double precision deltat
      double precision deltatclock
      double precision deltatfreesurf
      double precision deltatmom
      double precision delx(nx)
      double precision dely(ny)
      double precision diagfreq
      double precision diffk4s
      double precision diffk4t
      double precision diffkhs
      double precision diffkht
      double precision diffkrbl79deep
      double precision diffkrbl79ho
      double precision diffkrbl79scl
      double precision diffkrbl79surf
      double precision diffkrbleqdeep
      double precision diffkrbleqho
      double precision diffkrbleqscl
      double precision diffkrbleqsurf
      double precision diffkrnrs(nr)
      double precision diffkrnrt(nr)
      double precision drhosmall
      double precision dttracerlev(nr)
      double precision dumpfreq
      double precision endtime
      double precision epsab_cd
      double precision externforcingcycle
      double precision externforcingperiod
      double precision f0
      double precision fofacmom
      double precision freesurffac
      double precision gbaro
      double precision gravity
      double precision hfacinf
      double precision hfacmin
      double precision hfacmindp
      double precision hfacmindr
      double precision hfacmindz
      double precision hfacsup
      double precision hmixcriteria
      double precision hmixsmooth
      double precision implicdiv2dflow
      double precision implicitnhpress
      double precision implicsurfpress
      double precision ivdc_kappa
      double precision latbandclimrelax
      double precision mass2runit
      double precision monitorfreq
      double precision mtfacmom
      double precision nh_am2
      double precision omega
      double precision pchkptfreq
      double precision pffacmom
      double precision phieuler
      double precision phiref(2*nr+1)
      double precision psieuler
      double precision rcd
      double precision recip_gravity
      double precision recip_rhoconst
      double precision recip_rhofacc(nr)
      double precision recip_rhofacf(nr+1)
      double precision recip_rhonil
      double precision recip_rsphere
      double precision rho1ref(nr)
      double precision rhoconst
      double precision rhoconstfresh
      double precision rhofacc(nr)
      double precision rhofacf(nr+1)
      double precision rhonil
      double precision ro_sealevel
      double precision rotationperiod
      double precision rsigmabnd
      double precision rsphere
      double precision runit2mass
      double precision rvel2wunit(nr+1)
      double precision salt_addmass
      double precision salt_evprrn
      double precision sidedragfactor
      double precision smoothabsfuncrange
      double precision sref(nr)
      double precision starttime
      double precision taucd
      double precision tausaltclimrelax
      double precision tauthetaclimrelax
      double precision tave_lastiter
      double precision tavefreq
      double precision tcylin
      double precision tcylout
      double precision temp_addmass
      double precision temp_evprrn
      double precision thetaeuler
      double precision tref(nr)
      double precision vffacmom
      double precision visca4
      double precision visca4d
      double precision visca4grid
      double precision visca4gridmax
      double precision visca4gridmin
      double precision visca4max
      double precision visca4remax
      double precision visca4w
      double precision visca4z
      double precision viscah
      double precision viscahd
      double precision viscahgrid
      double precision viscahgridmax
      double precision viscahgridmin
      double precision viscahmax
      double precision viscahremax
      double precision viscahw
      double precision viscahz
      double precision viscarnr(nr)
      double precision viscc2leith
      double precision viscc2leithd
      double precision viscc2smag
      double precision viscc4leith
      double precision viscc4leithd
      double precision viscc4smag
      double precision viscfacadj
      double precision wunit2rvel(nr+1)
      double precision xgorigin
      double precision ygorigin
      common /parm_r/ cg2dtargetresidual, cg2dtargetreswunit, 
     $cg2dpcoffdfac, cg3dtargetresidual, delr, delrc, delx, dely, 
     $deltat, deltatmom, dttracerlev, deltatfreesurf, deltatclock, 
     $abeps, alph_ab, beta_ab, xgorigin, ygorigin, rsphere, 
     $recip_rsphere, f0, beta, viscfacadj, viscah, viscahw, viscahmax, 
     $viscahgrid, viscahgridmax, viscahgridmin, viscc2leith, 
     $viscc2leithd, viscc2smag, viscc4smag, viscahd, viscahz, visca4d, 
     $visca4z, visca4, visca4w, visca4max, visca4grid, visca4gridmax, 
     $visca4gridmin, viscahremax, visca4remax, viscc4leith, 
     $viscc4leithd, viscarnr, diffkht, diffk4t, diffkrnrt, diffkhs, 
     $diffk4s, diffkrnrs, diffkrbl79surf, diffkrbl79deep, diffkrbl79scl,
     $ diffkrbl79ho, bl79latvary, diffkrbleqsurf, diffkrbleqdeep, 
     $diffkrbleqscl, diffkrbleqho, taucd, rcd, epsab_cd, freesurffac, 
     $implicsurfpress, implicdiv2dflow, implicitnhpress, hfacmin, 
     $hfacmindz, hfacinf, hfacsup, gravity, recip_gravity, gbaro, 
     $rhonil, recip_rhonil, rhoconst, recip_rhoconst, rhofacc, 
     $recip_rhofacc, rhofacf, recip_rhofacf, rhoconstfresh, rho1ref, 
     $tref, sref, phiref, dbdrref, rvel2wunit, wunit2rvel, mass2runit, 
     $runit2mass, basetime, starttime, endtime, chkptfreq, pchkptfreq, 
     $dumpfreq, adjdumpfreq, diagfreq, tavefreq, tave_lastiter, 
     $monitorfreq, adjmonitorfreq, affacmom, vffacmom, pffacmom, 
     $cffacmom, fofacmom, mtfacmom, cospower, cadjfreq, omega, 
     $rotationperiod, tauthetaclimrelax, tausaltclimrelax, 
     $latbandclimrelax, externforcingcycle, externforcingperiod, 
     $convertfw2salt, temp_evprrn, salt_evprrn, temp_addmass, 
     $salt_addmass, hfacmindr, hfacmindp, ivdc_kappa, hmixcriteria, 
     $drhosmall, hmixsmooth, ro_sealevel, rsigmabnd, sidedragfactor, 
     $bottomdraglinear, bottomdragquadratic, nh_am2, smoothabsfuncrange,
     $ tcylin, tcylout, phieuler, thetaeuler, psieuler

C==============================================
C declare arguments
C==============================================
      integer mythid

C==============================================
C declare local variables
C==============================================
      integer bi
      integer bj
      integer i
      integer j

C----------------------------------------------
C ROUTINE BODY
C----------------------------------------------
      if (implicdiv2dflow .ne. 1.d0 .or. useobcs) then
        call adexch_xy_rl( adetah,mythid )
      endif
      do bj = mybylo(mythid), mybyhi(mythid)
        do bi = mybxlo(mythid), mybxhi(mythid)
          if (implicdiv2dflow .eq. 1.d0) then
            do j = 1-oly, sny+oly
              do i = 1-olx, snx+olx
                adetan(i,j,bi,bj) = adetan(i,j,bi,bj)+adetah(i,j,bi,bj)
                adetah(i,j,bi,bj) = 0.d0
              end do
            end do
          else
            do j = 1, sny
              do i = 1, snx
                addetahdt(i,j,bi,bj) = addetahdt(i,j,bi,bj)+adetah(i,j,
     $bi,bj)*(1.-implicdiv2dflow)*deltatfreesurf
                adetan(i,j,bi,bj) = adetan(i,j,bi,bj)+adetah(i,j,bi,bj)
                adetah(i,j,bi,bj) = 0.d0
              end do
            end do
          endif
        end do
      end do

      end

      subroutine adzero
C******************************************************************
C******************************************************************
C** This routine was generated by Automatic differentiation.     **
C** FastOpt: Transformation of Algorithm in Fortran, TAF 2.0.2   **
C******************************************************************
C******************************************************************
C==============================================
C all entries are defined explicitly
C==============================================
      implicit none

C==============================================
C declare parameters
C==============================================
      integer ndv2d
      parameter ( ndv2d = 23 )
      integer ndv3d
      parameter ( ndv3d = 12 )
      integer nr
      parameter ( nr = 15 )
      integer nsx
      parameter ( nsx = 2 )
      integer nsy
      parameter ( nsy = 2 )
      integer olx
      parameter ( olx = 2 )
      integer oly
      parameter ( oly = 2 )
      integer snx
      parameter ( snx = 45 )
      integer sny
      parameter ( sny = 20 )

C==============================================
C declare common blocks
C==============================================
      double precision adautodiff_store_dyn1(1-olx:snx+olx,1-oly:sny+
     $oly,nr,nsx,nsy,ndv3d)
      double precision adautodiff_store_dyn2(1-olx:snx+olx,1-oly:sny+
     $oly,nsx,nsy,ndv2d)
      common /adautodiff_store_dyn/ adautodiff_store_dyn1, 
     $adautodiff_store_dyn2

      double precision adcontrolvars_r1(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy)
      common /adcontrolvars_r/ adcontrolvars_r1

      double precision adcost_mean_r1(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy)
      common /adcost_mean_r/ adcost_mean_r1

      double precision adcost_objf7(nsx,nsy)
      double precision adcost_objf8(nsx,nsy)
      common /adcost_objf/ adcost_objf7, adcost_objf8

      double precision addynvars_cd1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision addynvars_cd2(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision addynvars_cd3(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy)
      double precision addynvars_cd4(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision addynvars_cd5(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      common /addynvars_cd/ addynvars_cd1, addynvars_cd2, addynvars_cd3,
     $ addynvars_cd4, addynvars_cd5

      double precision addynvars_diag2(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy)
      double precision addynvars_diag3(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy)
      common /addynvars_diag/ addynvars_diag2, addynvars_diag3

      double precision addynvars_r1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision addynvars_r10(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision addynvars_r11(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision addynvars_r12(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision addynvars_r13(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision addynvars_r14(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision addynvars_r2(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision addynvars_r3(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision addynvars_r4(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision addynvars_r5(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision addynvars_r6(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision addynvars_r7(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision addynvars_r8(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision addynvars_r9(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      common /addynvars_r/ addynvars_r1, addynvars_r2, addynvars_r3, 
     $addynvars_r4, addynvars_r5, addynvars_r6, addynvars_r7, 
     $addynvars_r8, addynvars_r9, addynvars_r10, addynvars_r11, 
     $addynvars_r12, addynvars_r13, addynvars_r14

      double precision addynvars_r_21(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy)
      common /addynvars_r_2/ addynvars_r_21

      double precision adexact_eta_local2(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adexact_eta_local3(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      common /adexact_eta_local/ adexact_eta_local2, adexact_eta_local3

      double precision adffields_empmr1(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy)
      common /adffields_empmr/ adffields_empmr1

      double precision adffields_fu1(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy)
      common /adffields_fu/ adffields_fu1

      double precision adffields_fv1(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy)
      common /adffields_fv/ adffields_fv1

      double precision adffields_qnet1(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy)
      common /adffields_qnet/ adffields_qnet1

      double precision adffields_saltflux1(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      common /adffields_saltflux/ adffields_saltflux1

      double precision adffields_sss1(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy)
      common /adffields_sss/ adffields_sss1

      double precision adffields_sst1(1-olx:snx+olx,1-oly:sny+oly,nsx,
     $nsy)
      common /adffields_sst/ adffields_sst1

      double precision adgm_hortensor1(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy)
      double precision adgm_hortensor2(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy)
      common /adgm_hortensor/ adgm_hortensor1, adgm_hortensor2

      double precision adgm_uvtensor1(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy)
      double precision adgm_uvtensor2(1-olx:snx+olx,1-oly:sny+oly,nr,
     $nsx,nsy)
      common /adgm_uvtensor/ adgm_uvtensor1, adgm_uvtensor2

      double precision adgm_wtensor1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision adgm_wtensor2(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      double precision adgm_wtensor3(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,
     $nsy)
      common /adgm_wtensor/ adgm_wtensor1, adgm_wtensor2, adgm_wtensor3

      double precision admean_qnet1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /admean_qnet/ admean_qnet1

      double precision adsurf_correc1
      double precision adsurf_correc2
      common /adsurf_correc/ adsurf_correc1, adsurf_correc2

      double precision adsurface_forcing1(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurface_forcing2(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurface_forcing3(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurface_forcing4(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      double precision adsurface_forcing5(1-olx:snx+olx,1-oly:sny+oly,
     $nsx,nsy)
      common /adsurface_forcing/ adsurface_forcing1, adsurface_forcing2,
     $ adsurface_forcing3, adsurface_forcing4, adsurface_forcing5

      double precision adtdfields1(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtdfields10(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtdfields11(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtdfields12(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtdfields13(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtdfields14(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtdfields2(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtdfields3(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtdfields4(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtdfields5(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtdfields6(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtdfields7(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtdfields8(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      double precision adtdfields9(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
      common /adtdfields/ adtdfields1, adtdfields2, adtdfields3, 
     $adtdfields4, adtdfields5, adtdfields6, adtdfields7, adtdfields8, 
     $adtdfields9, adtdfields10, adtdfields11, adtdfields12, 
     $adtdfields13, adtdfields14

C==============================================
C declare local variables
C==============================================
      integer ip1
      integer ip2
      integer ip3
      integer ip4
      integer ip5
      integer ip6


C----------------------------------------------
C reset adjoint common block variables
C----------------------------------------------
      do ip6 = 1, ndv3d
        do ip5 = 1, nsy
          do ip4 = 1, nsx
            do ip3 = 1, nr
              do ip2 = 1-oly, sny+oly
                do ip1 = 1-olx, snx+olx
                  adautodiff_store_dyn1(ip1,ip2,ip3,ip4,ip5,ip6) = 0.d0
                end do
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, ndv2d
        do ip4 = 1, nsy
          do ip3 = 1, nsx
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adautodiff_store_dyn2(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adcontrolvars_r1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adcost_mean_r1(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip2 = 1, nsy
        do ip1 = 1, nsx
          adcost_objf7(ip1,ip2) = 0.d0
        end do
      end do
      do ip2 = 1, nsy
        do ip1 = 1, nsx
          adcost_objf8(ip1,ip2) = 0.d0
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_cd1(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_cd2(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              addynvars_cd3(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_cd4(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_cd5(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_diag2(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_diag3(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              addynvars_r1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_r2(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_r3(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_r4(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_r5(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_r6(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_r7(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_r8(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_r9(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_r10(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_r11(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_r12(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_r13(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                addynvars_r14(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              addynvars_r_21(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adexact_eta_local2(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adexact_eta_local3(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adffields_empmr1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adffields_fu1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adffields_fv1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adffields_qnet1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adffields_saltflux1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adffields_sss1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adffields_sst1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adgm_hortensor1(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adgm_hortensor2(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adgm_uvtensor1(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adgm_uvtensor2(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adgm_wtensor1(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adgm_wtensor2(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip5 = 1, nsy
        do ip4 = 1, nsx
          do ip3 = 1, nr
            do ip2 = 1-oly, sny+oly
              do ip1 = 1-olx, snx+olx
                adgm_wtensor3(ip1,ip2,ip3,ip4,ip5) = 0.d0
              end do
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              admean_qnet1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      adsurf_correc1 = 0.d0
      adsurf_correc2 = 0.d0
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adsurface_forcing1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adsurface_forcing2(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adsurface_forcing3(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adsurface_forcing4(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adsurface_forcing5(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adtdfields1(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adtdfields2(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adtdfields3(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adtdfields4(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adtdfields5(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adtdfields6(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adtdfields7(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adtdfields8(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adtdfields9(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adtdfields10(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adtdfields11(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adtdfields12(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adtdfields13(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do
      do ip4 = 1, nsy
        do ip3 = 1, nsx
          do ip2 = 1-oly, sny+oly
            do ip1 = 1-olx, snx+olx
              adtdfields14(ip1,ip2,ip3,ip4) = 0.d0
            end do
          end do
        end do
      end do

      end


More information about the MITgcm-devel mailing list